2016-09-16 5 views
0

私は... PL/SQLの下PL/SQLのコンパイル・エラー - PLS-00382:式が間違っているタイプのものであり

DECLARE 
BEGIN 
FOR i IN (select VALUE from REWARDS) 
LOOP 
insert into BT_CMS.T_REWARDS_TYPES 
(ID, REWARD_LABEL, REWARD_VALUE, REWARD_METHOD, UPDATE_USER, UPDATE_DATE, PAYMENT_PROVIDER_ID, CREATE_DATE, COUNTRY_CODE_ID) 
values 
(BT_CMS.SEQ_REWARD_TYPE_ID.nextval, 'R' || i || ' Real Time', i, 'Airtime', 'DEVOPS-826', sysdate, 120, sysdate, 206); 
END LOOP; 
END; 

を実行している...と、以下のエラーを取得...

ORA-06550: line 8, column 72: 
PLS-00382: expression is of wrong type 
ORA-06550: line 8, column 52: 
PLS-00382: expression is of wrong type 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 

私はかなり問題が、値に代入されていると確信していますが、正確に何が問題なのかわかりません。私が選択されているREWARDS表のVALUE列にdata_type = VARCHAR2(20バイト)が入っています。私が挿入しようとしているREWARD_LABEL列にdata_type = VARCHAR2(50 CHAR)があります。

答えて

3

ループ内では、iは、レコードの(一意の)フィールドではなく、レコード全体を指します。あなたはi.valueの代わりiを使用する必要があります。

DECLARE 
BEGIN 
    FOR i IN (SELECT VALUE FROM REWARDS) 
    LOOP 
     INSERT INTO BT_CMS.T_REWARDS_TYPES(
              ID, 
              REWARD_LABEL, 
              REWARD_VALUE, 
              REWARD_METHOD, 
              UPDATE_USER, 
              UPDATE_DATE, 
              PAYMENT_PROVIDER_ID, 
              CREATE_DATE, 
              COUNTRY_CODE_ID 
             ) 
      VALUES (
        BT_CMS.SEQ_REWARD_TYPE_ID.NEXTVAL, 
        'R' || i.VALUE || ' Real Time', 
        i.VALUE, 
        'Airtime', 
        'DEVOPS-826', 
        SYSDATE, 
        120, 
        SYSDATE, 
        206 
        ); 
    END LOOP; 
END; 

より良いアプローチは、単一のインサート・セレクト代わりにカーソルをループのを使用している可能性。たとえば、

INSERT INTO BT_CMS.T_REWARDS_TYPES(
            ID, 
            REWARD_LABEL, 
            REWARD_VALUE, 
            REWARD_METHOD, 
            UPDATE_USER, 
            UPDATE_DATE, 
            PAYMENT_PROVIDER_ID, 
            CREATE_DATE, 
            COUNTRY_CODE_ID 
           ) 
    SELECT BT_CMS.SEQ_REWARD_TYPE_ID.NEXTVAL, 
      'R' || r.VALUE || ' Real Time', 
      r.VALUE, 
      'Airtime', 
      'DEVOPS-826', 
      SYSDATE, 
      120, 
      SYSDATE, 
      206 
     FROM REWARDS r 
+0

ああ、2番目のオプションははるかに簡単です。 完璧な答え。ありがとう、@アレクセ! –

+0

@Aleksej - コードの書式設定にはどのツール/ URLを使用しますか?非常にきれいに見えます。 – Utsav

+0

@Utsav - いくつかの設定の後、Oracle v12.1のToadです – Aleksej

関連する問題