Pergunta

Esta é a primeira vez que eu tenho lidado com a Oracle, e eu estou tendo dificuldade em entender por que estou recebendo este erro.

Eu estou usando ODT.NET da Oracle w / C # com o seguinte código em uma consulta é onde cláusula:

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

e eu estou adicionando os valores dos parâmetros da seguinte forma:

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

Quando eu executar essa consulta, o servidor retorna:

ORA-01008: not all variables bound 

Se eu comentar uma das linhas 'E (....', os concluída consulta com êxito.

Por que a consulta executado através bem se eu só estou consultando com dois parâmetros, mas não com três? O erro que eu estou recebendo não faz muito sentido

Foi útil?

Solução

O provedor ODP.Net partir utiliza o Oracle se ligam por posição como padrão. Para alterar o comportamento de se ligar pelo nome. Conjunto de propriedades BindByName para true. Do que você pode descartar a dupla definição de parâmetros.

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}

Outras dicas

Parece idiota, mas eu acho que quando você usar a mesma variável de ligação duas vezes você tem que configurá-lo duas vezes:

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

Certamente isso é verdade com Native dinâmico SQL em 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.

Você também pode considerar a remoção da necessidade de parâmetro nomes duplicados no seu SQL, alterando o seu SQL para

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

e, em seguida, obter o seu cliente para fornecer '%' para qualquer valor de varb em vez de nulo. De certa forma eu acho que isso é mais natural.

Você também pode alterar o SQL para

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top