[Oracle] バインド変数の上限を超えると ORA-01745 が発生する | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

ORA-01745: ホスト/バインド変数名が無効です。
は以下のようにバインド変数名に予約語を指定してしまった場合などに発生します。

SQL> var number number;
SQL> select * from emp where empno = :number;
select * from emp where empno = :number
                                 *
行1でエラーが発生しました。:
ORA-01745: ホスト/バインド変数名が無効です。

しかし、このエラーは、上記のようなケースだけでなく、バインド変数の数の上限を超えた場合にも発生します。

ただ、その上限というのが 32768 ととてつもなく大きい数ですので、普通はまず超えることはないと思います。

上限を突破するとすれば、条件となる値のリストを受け取って、それを IN 句に列挙するというような SQL で、その値のリストがバインド変数の数の上限を超えてしまうようなケースくらいではないでしょうか。

select * from emp
  where empno in ( :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, ... );

このような SQL は、プログラムでグルグルとループを回しながら、動的に生成することと思います。

その際、値のリストを無制限に受け入れるよな実装になっていると、上記のエラーが発生する隙を与えてしまいますので、事前に何らかのチェックを行う必要があるかと思います。


というより...

こういうSQLを発行すること自体が無謀なので、例えば値のリストを一時テーブルに保存して、SELECT 対象のテーブルと JOIN するなど、別の方法を考えたほうがよいかと思います。