Oracle “ORA-01008: não todas as variáveis ??vinculados” Erro w / Parâmetros
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
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, '%') || '%'