2016-09-16 3 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. 

Я уверен, что проблема заключается в замене меня на значения, но я не знаю, в чем проблема. Столбец VALUE в таблице REWARDS, выбранный i, имеет data_type = VARCHAR2 (20 BYTE). Столбец 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

Ах, второй вариант намного проще. Отличный ответ. Спасибо, @Aleksej !! –

+0

@Aleksej - Какой инструмент/url вы используете для форматирования кода? Выглядит очень чисто. – Utsav

+0

@Utsav - это жаба для Oracle v12.1, после некоторой конфигурации – Aleksej