【问题标题】:Executing an inline statement with stored procedure using Oracle.ManagedAccess使用 Oracle.ManagedAccess 执行带有存储过程的内联语句
【发布时间】:2019-05-11 11:38:33
【问题描述】:
StringBuilder sql_statement  = new StringBuilder();

sql_statement.Append("sampleStoreproc(null, 1); ");
sql_statement.Append("SELECT 'Y' FROM myTable ");
sql_statement.Append("WHERE column1 = null AND column2 = 1 ");

DataAccessObject.ExecuteReader(
    connectionString, 
    CommandType.Text, 
    sql_statement.ToString());

这给我带来了错误:

ORA-0090 无效的 SQL 语句

我尝试在语句的最后添加; 分号,但它不起作用。

我复制了整个文本并将其完美地执行到 SQL Developer 中。

【问题讨论】:

  • Oracle 是否可能允许您在这样的单个语句中执行多个语句?
  • 它是一个存储过程,
  • 我是 oracle 新手,所以我不知道它是否允许
  • 可以批量执行,但需要严格遵守PL/SQL语法规则。例如,第二条指令后没有分号,IIRC 需要将批次放在 BEGIN .... END 中;此外,NULL 比较的习惯用法是 column1 IS NULL 而不是 column1 = null

标签: c# .net oracle plsql oracle12c


【解决方案1】:

在您的第一条语句中,您正在调用一个存储过程。改成:

sql_statement.Append("execute sampleStoreproc(null, 1); ");

还建议在最后一行的末尾添加一个分号。

编辑:尝试将您的两个语句都包含在 begin...end; 块中:

sql_statement.Append("begin");
sql_statement.Append("  execute sampleStoreproc(null, 1);");
sql_statement.Append("  SELECT 'Y' FROM myTable");
sql_statement.Append("  WHERE column1 = null AND column2 = 1;");
sql_statement.Append("end;");

【讨论】:

  • 没有用,使用 Oracle.ManagedAccess.dll 进行连接
  • 然后尝试将您的两个语句都包含在 begin...end; 块中。请参阅我的更新答案。
  • 尝试使用 begin end ,我认为它与我们用于执行的 Oracle.ManagedAccess.dll 有问题
  • 当我使用 BEGIN END 时,它说它找不到函数 "sampleStoreproc" ,它显然存在
  • 哦,我认为我们不应该在 begin...end; 块中使用 execute。尝试不使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2014-12-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多