Oracle "ORA-01008: не все переменные связаны" Ошибка с параметрами - PullRequest
30 голосов
/ 14 сентября 2009

Я впервые имею дело с Oracle, и мне трудно понять, почему я получаю эту ошибку.

Я использую Oracle ODT.NET w / C # со следующим кодом в предложении where:

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

и я добавляю значения параметров следующим образом:

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");

Когда я запускаю этот запрос, сервер возвращает:

ORA-01008: not all variables bound 

Если я закомментирую одну из строк 'AND (....'), запрос завершится успешно.

Почему запрос выполняется нормально, если я запрашиваю только два параметра, а не три? Ошибка, которую я получаю, даже не имеет смысла

Ответы [ 3 ]

44 голосов
/ 15 сентября 2009

Поставщик ODP.Net из Oracle использует связывание по позиции по умолчанию. Чтобы изменить поведение, чтобы связать по имени. Установите для свойства BindByName значение true. Чем вы можете отклонить двойное определение параметров.

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}
24 голосов
/ 14 сентября 2009

Это кажется глупым, но я думаю, что когда вы используете одну и ту же переменную связывания дважды, вы должны установить ее дважды:

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");

Конечно, это верно для Native Dynamic SQL в PL / 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.
2 голосов
/ 19 сентября 2011

Вы также можете исключить необходимость дублирования имен параметров в вашем Sql, изменив Sql на

table.Variable2 LIKE '%' || :VarB || '%'

, а затем заставляет вашего клиента указывать «%» для любого значения VarB вместо нуля. В некотором смысле я думаю, что это более естественно.

Вы также можете изменить Sql на

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...