開発時に発生するエラー
ORA-01008:バインドされていない変数があります
ORA-01008: 〜エラーを簡単に解決できていないということは、以下の 3つの可能性がある。
開発ツールを使用しての固有の問題(=不具合)は除外する。(各ベンダの バグ情報、FAQ などを参照)
ほとんどの場合が単なるバインド変数の記述もれ、コメント化していることを見落としていたりなどのケアレスミスである。
どうしても解決できない場合にはプリントアウトしてみて机上でチェックすると発見しやすい。
原因
日本語表記の識別子を引用識別子として定義していない場合に発生することがある。
対応
日本語を使用する場合には、引用識別子として正しく記述する。
引用符でコロン(:) まで括ってはいけない。
記述例: (誤) ":name" ⇒ (正) :"name"
原因
システム固有の動的 SQL において SQL と PL/SQL ブロックにおけるプレースホルダとバンド変数の関係を誤解している可能性がある。
対応
システム固有の動的 SQL の プレースホルダ と バインド変数 を参照
原因
デフォルト設定では有効になっていない、そのバージョンの「新機能」を使用することで発生することがある。
対応
基本的にはサポート行き
デフォルト設定から変更して新しい機能を有効にしている場合には、設定をデフォルトに戻してみる。
デフォルトの設定が、おそらく世界中で一番テストされている環境である。
サポート契約を結んでいる場合には、最新バージョンの Oracle でなければパッチが提供されている可能性は高いので
、やはりサポート行きとなる。
原因
理由は良くわからないが CALL(
〜) 特有の問題で
number を戻すファンクション f と SQL*Plus 上の バインド変数 var n number に対して
SQL> call f(1) into :n; を実行すると、バインドされていない旨のエラーが発生した。(Oracle 10.2.0.1.0)
対応
プレースホルダ名との相性?
SQL> call f(1) into :n ; のようにセミコロンの前にスペースを設置すると問題なく実行された。
:n; で1ワードになってしまっているようである。SQL*Plus 上の 予約語 に思い当たるものはない…
この問題は n 以外の変数名では発生しないようであるが SQL*Plus でのバインド変数名は1文字や予約語に似た文字にしない方が良いだろう。
一覧ページへ戻る
OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。