5

このエラーについてお聞きしたいのですが...

   Error 49 at line 5, column 6
       bad bind variable 'S_ORD.payment_type'

コードは次のとおりです。

    DECLARE
     N NUMBER;
      v_credit S_CUSTOMER.credit_rating%type;
    BEGIN
      IF :S_ORD.payment_type = 'CREDIT' THEN
        SELECT credit_rating
        INTO v_credit
        FROM S_CUSTOMER
      WHERE :S_ORD.customer_id = id;
      IF v_credit NOT IN ('GOOD', 'EXCELLENT') THEN
            :S_ORD.payment_type:= 'CASH';
          n:=SHOW_ALERT('Payment_Type_Alert');
      END IF;
     END IF;
   END;

私はオラクルフォームを初めて使用するので、セットアップが不足しているかどうかはわかりません。S_ORD テーブルが存在し、'CREDIT' と 'CASH' の値で構成される支払いタイプの列があります。ありがとうございました。

4

4 に答える 4

2

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でフォームバインド変数(アイテム、パラメータ、グローバル変数)の値を参照する場合は、間接参照を必須とします。ライブラリ、メニュー、およびフォームは別個のアプリケーション モジュールであるため、メニュー項目コマンドまたはライブラリ プロシージャでフォーム項目の値を直接参照することはできません。

于 2012-07-05T08:00:56.477 に答える
1

簡単な答えとして-

Oracle フォームで

 :S_ORD.payment_type

と呼ばれる(おそらく a )を持つDATA_BLOCK名前があることを意味します。S_ORDelementTEXT ITEMPAYMENT_TYPE

そのため、Oracle フォームにそのようなデータ ブロックと要素がない限り、引き続きエラーが発生します。コロンを使用したバインド変数は、または:と同じようには機能しません。解決策として、次のようにテーブルに置くことができますSQLPL/SQLDECLARECURSORS_ORD

CURSOR c_pymnt_type IS
 SELECT payment_type
   FROM S_ORD;

そしてOPEN、プロシージャFETCHCLOSEのカーソル。

于 2012-08-15T16:03:21.553 に答える
0

あなたのコードを見ることができず、あなたが私たちに多くの情報を提供してくれなかったため、あなたが何をしたかを知ることは明らかに非常に困難です. これは推測です。

S_ORD は、S_ORD と呼ばれるテーブルに基づいて (私は願っています)、フォーム内のブロックです。投稿されたスニペットは、実際には問題ではありませんが、おそらく POST-QUERY または WHEN-VALIDATE-ITEM などのトリガーで実行されており、そのブロックの PAYMENT_TYPE というフィールドに入力することになっています。

エラーメッセージは、ブロック S_ORD に PAYMENT_TYPE というフィールドがないことを示しています。(コロン表記はバインド変数を表し、グローバル変数なども同じ方法で参照できるため、「バインド変数」と表示されます)。

フィールドが存在しないのはなぜですか?また:

  1. テーブルには PAYMENT_TYPE という列があり、ブロックを作成したときにそれを選択していません。また
  2. テーブルには PAYMENT_TYPE という列がありません。
  3. データ ブロックの名前は S_ORD ではありません。

最初のケースでは、ブロック プロパティ エディタに移動して列を追加する必要があります。2 番目のケースでは、ベース テーブル以外のアイテムをブロックに追加する必要があります。 方法については、こちらをご覧ください。データ ブロックにテーブル名以外の名前を付けた場合 (そうする正当な理由がある場合もあります)、呼び出しではテーブル名ではなくブロック名を使用する必要があります)。

于 2012-07-05T05:11:56.670 に答える