Oracle Forms では、コードがライブラリまたはメニューにある場合、バインド変数を使用できません。
以下は、Oracle Forms (6i) ヘルプからの引用です。
NAME_IN および COPY 組込みサブプログラムを使用してアイテムを間接的に参照できます。NAME_IN 関数は、指定された変数または項目の内容を返します。アイテムを直接参照せずにアイテムの値を取得するには、NAME_IN 関数を使用します。次のステートメントは同等です。
IF :emp.ename = 'smith' -- 直接参照
IF NAME_IN('emp.ename') = 'smith' -- 間接参照
戻り値は常に文字列です。DATE または NUMBER 項目に NAME_IN を使用するには、適切な変換関数を使用して文字列を目的のデータ型に変換します。
date_var := TO_DATE(Name_In('order.date_item'));
num_var := TO_NUMBER(Name_In('order.number_item'));
NAME_IN に関するメモ:
· NAME_IN 関数は、グローバル変数またはローカル変数の内容を返すことはできません。
· 問合せ入力モードで実行されるPL/SQLトリガーでは、データ・ブロック内の値にアクセスするには、通常のバインド変数表記ではなくNAME_INを使用する必要があります。(これは、エンド・ユーザーがアイテムに関係演算子を入力して、PL/SQLで処理できる形式ではない値を生成する可能性があるためです。)
COPY プロシージャ COPY プロシージャは、指定された値を、指定された変数または項目に代入します。ただし、標準の PL/SQL 割り当てとは異なり、COPY プロシージャを使用すると、値が設定されているアイテムを間接的に参照できます。
:emp.ename:= 'スミス'; -- 直接参照 Copy('smith','emp.ename'); -- 間接参照
COPY を NAME_IN 関数と共に使用して、名前が参照変数または項目に格納されている項目に値を割り当てることができます。
/* 値 'smith' を ref_item に格納されている名前のアイテムに入れます */ Copy('smith',Name_In('control.ref_item'));
間接参照を使用する理由
項目を間接的に参照すると、より一般的で再利用可能なコードを記述できます。実際の項目名の代わりに変数を使用することにより、指定された変数に名前が割り当てられている任意の項目を操作できるサブプログラムを作成できます。また、ライブラリやメニューモジュールに記述したPL/SQLでフォームバインド変数(アイテム、パラメータ、グローバル変数)の値を参照する場合は、間接参照を必須とします。ライブラリ、メニュー、およびフォームは別個のアプリケーション モジュールであるため、メニュー項目コマンドまたはライブラリ プロシージャでフォーム項目の値を直接参照することはできません。