Oracle "ORA-01008: pas toutes les variables liées" erreur w / Paramètres
c'est la première fois que je traite avec Oracle, et j'ai du mal à comprendre pourquoi je reçois cette erreur.
j'utilise L'Oracle ODT.NET w / C# with the following code in a quirey's where clause:
WHERE table.Variable1 = :VarA
AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%')
AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%')
et je suis en ajoutant les valeurs de paramètre, comme ceci:
cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
Lorsque j'exécute cette requête, le serveur renvoie:
ORA-01008: not all variables bound
si je commente l'un ou l'autre de la 'et (....'lignes, la requête est exécutée avec succès.
pourquoi la requête fonctionnerait-elle correctement si je n'interroge qu'avec deux paramètres, mais pas avec trois? L'erreur que je reçois n'a même pas de sens
3 réponses
Le ODP.Net le fournisseur d'oracle utilise bind by position par défaut. Pour changer le comportement à lier par le nom. Définir la propriété BindByName pour vrai. Que vous pouvez rejeter la double définition des paramètres.
using(OracleCommand cmd = con.CreateCommand()) {
...
cmd.BindByName = true;
...
}
cela semble stupide, mais je pense que lorsque vous utilisez la même variable bind deux fois vous devez la définir deux fois:
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");
C'est certainement vrai avec Native Dynamic SQL en 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.
vous pouvez également envisager de supprimer le besoin de noms de paramètres dupliqués dans votre Sql en changeant votre Sql en
table.Variable2 LIKE '%' || :VarB || '%'
et ensuite amener votre client à fournir ' % ' pour N'importe quelle valeur de VarB au lieu de null. À certains égards, je pense que c'est plus naturel.
vous pouvez aussi changer le Sql en
table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%'