Oracle"ORA-01008:并非所有变量绑定"错误w /参数

Joh*_*ohn 30 sql oracle plsql oracle10g

这是我第一次处理Oracle,我很难理解为什么我收到这个错误.

我在查询的where子句中使用Oracle的ODT.NET w/C#和以下代码:

WHERE table.Variable1 = :VarA
  AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%')
  AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%')
Run Code Online (Sandbox Code Playgroud)

我正在添加参数值,如下所示:

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,服务器返回:

ORA-01008: not all variables bound 
Run Code Online (Sandbox Code Playgroud)

如果我注释掉'AND(....'行中的任何一行,则查询成功完成.

如果我只查询两个参数,而不是三个参数,为什么查询会正常运行?我收到的错误甚至没有意义

Chr*_*467 44

来自oracle的ODP.Net提供程序使用bind by position作为默认值.要按名称更改要绑定的行为.将属性BindByName设置为true.比你可以忽略参数的双重定义.

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 24

这似乎是愚蠢的,但我认为当你使用相同的绑定变量两次时,你必须设置它两次:

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
cmd.Parameters.Add("VarC", "1234");
Run Code Online (Sandbox Code Playgroud)

当然,PL/SQL中的Native Dynamic SQL也是如此:

SQL> begin
  2     execute immediate 'select * from emp where ename=:name and ename=:name'
  3     using 'KING';
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-01008: not all variables bound


SQL> begin
  2     execute immediate 'select * from emp where ename=:name and ename=:name' 
  3     using 'KING', 'KING';
  4  end;
  5  /

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)