Oracle “РТЫ 01008: не все переменные связали” Ошибку w/Параметры

Оператор переключения быстрее для выполнения, чем if-else-if лестничная структура. Это происходит из-за способности компилятора оптимизировать оператор переключения. В случае if-else-if лестничной структуры код должен обработать каждого если оператор в порядке, определенном программистом. Однако, потому что каждый случай в операторе переключения не полагается на более ранние случаи, компилятор в состоянии переупорядочить тестирование таким способом как для обеспечения самого быстрого выполнения.

30
задан OMG Ponies 14 September 2009 в 14:51
поделиться

2 ответа

Провайдер ODP.Net от oracle по умолчанию использует привязку по позиции. Для изменения поведения привязать по имени. Установите для свойства BindByName значение true. Тогда вы можете отказаться от двойного определения параметров.

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}
44
ответ дан 27 November 2019 в 23:29
поделиться

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

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.
24
ответ дан 27 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: