2009-09-14 25 views
31

Oracleを初めて処理したので、なぜこのエラーが発生するのか理解できません。Oracle「ORA-01008:すべての変数がバインドされていません」エラーw /パラメータ

私は、クエリのwhere句に次のコードを使用してOracleのODT.NET W/C#を使用しています:

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

と、私はそうのようなパラメータ値を追加している:

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

私は「AND(....」行のいずれか、クエリカンプをコメントアウトした場合

ORA-01008: not all variables bound 

:私はこのクエリ、サーバーのリターンを実行すると、うまくいった。

2つのパラメータでクエリを実行しても3つでクエリを実行しないとクエリが正常に実行されないのはなぜですか?私が受けてるのエラーも意味

+0

にSQLを変更するだろうか? –

答えて

42

oracleのODP.Netプロバイダは、デフォルトで位置によってバインドを使用します。バインドする動作を名前で変更します。プロパティBindByNameをtrueに設定します。あなたはパラメータの二重定義を却下することができます。あなたはまた、

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

にあなたのSQLを変更してVARBの任意の値は「%」を提供するために、あなたのクライアントを取得する代わりにして、SQLで重複パラメータ名の必要性を削除することを検討可能性がある

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

これは意味があります...私はパラメータを昨日変更し、変数の位置でバインドされていることを認識しました。それを変更するオプションがあることを認識していない – John

+0

これは良いですChristian13467!私は8iから10gまでのネイティブの.Net Oracle Data Providerに関する私の経験を知りませんでした。この回答に感謝します。 –

+1

優れたソリューション。パラメータを複製するよりもずっと優れています。 @ジョン - 13000人を超える人々があなたの質問をすでに見たことがあるなら、この答えを受け入れることを本当に考えなければなりません。(申し訳ありませんトニー) – Kobi

23

がありませんそれは愚かようだが、私はあなたが同じバインド変数を使用するときに二回あなたがそれを2回設定する必要が思う:

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

確かにそれはネイティブと本当ですPL/SQLでの動的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. 
+0

それは働いた...それはその荘園で行動するとは信じられないが、それは働いたので、私はそれを取るよ!ありがとう! – John

+1

複数回指定するだけでなく、クエリに表示される順序で追加する必要があります。 –

+0

私は非常に古いポストにピギーバックするつもりはありません...しかし、これは(複数回使用する場合は複数のパラメータを追加する必要がありますか?私は何かが私のためにローカルで動作する奇妙なシナリオを扱っていますが、プロダクションのユーザーがそれを実行したときに失敗しました。今のところ変更を取り消しましたが、 '01008'というエラーがなぜユーザーにしか表示されなかったのかが分かりません。 –

2

ヌル。いくつかの点で私はこれがもっと自然だと思う。

はまた、あなたはそれが実行される前に、SQL文をプリントアウトするためにDBMS_OUTPUTを使用することができます

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%' 
関連する問題