2016-09-16 4 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 BYTE)가 선택되어 있습니다. REWARD_LABEL 열에는 data_type = VARCHAR2 (50 CHAR)이 삽입됩니다.

답변

3

루프 내에서 i은 레코드의 (고유 한) 필드가 아닌 전체 레코드를 나타냅니다. 당신은 i 대신 i.value를 사용해야합니다 :

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의 Toad입니다. – Aleksej

관련 문제