Oracle PL SQL 从 SQL Dev 工作。但不是来自代码

Posted

技术标签:

【中文标题】Oracle PL SQL 从 SQL Dev 工作。但不是来自代码【英文标题】:Oracle PL SQL works from SQL Dev. but not from the code 【发布时间】:2012-02-15 12:56:20 【问题描述】:

我在这里慢慢发疯了...为什么 SQL Developer 可以使用这种平静的 SQL 代码 而不是来自 C#?

declare x integer;
begin
insert into aspa2_counters (shortname, description, devicegroupid) values ('TEST0', 'DESC0', 61) returning counterid into x;
INSERT ALL  
INTO aspa2_priceclass (from_num, to_num, price, fk_counterid) VALUES (0,100,0.22,x) 
INTO aspa2_priceclass (from_num, to_num, price, fk_counterid) VALUES (101,200,0.23,x) 
SELECT * FROM dual; 
end;

在代码中动态生成多个插入。 请帮助...我在这个上花了两天时间,它正在减慢项目的速度。 如果需要,请务必提供更多信息。

谢谢!

编辑:我忘了写下错误:

ORA-06550: line 1, column 19:
PLS-00103: Encountered the symbol "" when expecting one of the following:

   begin function package pragma procedure subtype type use
   <an identifier> <a double-quoted delimited-identifier> form
   current cursor

【问题讨论】:

如果你说它不适用于 C#,请发布 C# 代码 出于调试目的,我已经硬编码了上面的PLSQL语句......所以我猜代码不相关。 您能向我们展示 C# 代码中的硬编码语句吗?我的意思是:string sqlStr = "declare x integer; begin ..."; 【参考方案1】:

好的,我终于解决了问题。

看起来 Oracle 的 odp.net 对换行符(“\r\n”和“\n”)非常敏感,所以请确保 您不要将 @ 用于多行字符串,或者尝试使用 .replace() 方法将“\r\n”替换为“\n”。

最后是这样的:

string anonymousBlock = "declare x integer;" +
                        "begin " +
                        "insert into aspa2_counters (shortname, description, devicegroupid) values (:p1, :p2, :p3) returning counterid into x;" +
                          buildInsert.ToString() + 
                        " end;";

【讨论】:

你先生,真棒!【参考方案2】:

这里是硬编码部分:

string query = @"declare x integer;
                      begin
                      insert into aspa2_counters (shortname, description, devicegroupid) values ('TEST', 'OPIS', 61) returning counterid into x;
                      INSERT ALL  
                          INTO aspa2_priceclass (from_num, to_num, price, fk_counterid) VALUES (0,100,0.22,x) 
                          INTO aspa2_priceclass (from_num, to_num, price, fk_counterid) VALUES (101,200,0.23,x) 
                      SELECT * FROM dual; 
                      end;";

和代码Oracle命令代码:

            using (OracleCommand cmnd = new OracleCommand(cmndText, con))
            
                if (parameters != null)
                
                    foreach (OracleParameter p in parameters)
                    
                        cmnd.Parameters.Add(p);
                    
                

                try
                
                    cmnd.ExecuteNonQuery();
                
                catch (Exception ex)
                

                
            

【讨论】:

以上是关于Oracle PL SQL 从 SQL Dev 工作。但不是来自代码的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL Developer 替代方案 [关闭]

将存储过程 PL/SQL 转换为 Java

从 oracle PL/SQL 查看变量的值

从 Oracle PL/SQL 多级集合生成 XML

Oracle PL/SQL语句基础学习笔记(上)

从 PL/SQL 调用另一个 Oracle 数据库中的过程