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

31
demandé sur OMG Ponies 2009-09-14 18:47:50

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;
    ...
}
43
répondu Christian13467 2009-09-15 07:38:45

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.
24
répondu Tony Andrews 2009-09-14 15:55:52

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, '%') || '%'
2
répondu Hugh Jones 2011-09-19 16:11:31