Study/SQL.

오라클 에러 ORA-00997, ORA-00932

의미없는 시간은 없다. 2021. 9. 7. 10:23

1.원인발생 

서로 컬럼의 크기가 다른 LONG RAW 타입의 데이터를 인서트 or 업데이트 할 때 발생

LONG RAW 타입은 이미지를 저장하거나, 대용량의 데이터를 저장할때 사용.

 

2.해결방법

step1. 데이터를 넣을 테이블의 정보를 확인

일반적인 desc table명; 으로는 타입만 보인다. 평범한 타입이면 상관이없으나, 이미지 저장이나 대용량 저장을 위한 LONG RAW타입은 할당 된 데이터의 크기를 알지못하므로 테이블 스크립트를 통해 할당된 용량을 확인.

 

step2. 쉬운 케이스 (BLOB 컬럼이 COLUMN_B, COLUMN_D)

    1)INSERT INTO TABLE_A(COLUMN_A,COLUMN_B)

      SELECT COLUMN_C, TO_LOB(COLUMN_D) FROM TABLE_B

    2)INSERT INTO TABLE_A(COLUMN_A,COLUMN_B)

      SELECT COLUMN_C, TO_BLOB(COLUMN_D) FROM TABLE_B

일반적으로는 이렇게 해결이 됨.

==>이렇게 해결이 안되면 PL/SQL를 사용

 

step3. 어려운케이스(오라클의 CURSOR와 LOOP를 사용한다.)

--CURSOR_NAME 커서의 이름

DECLARE
    BEGIN
            DECLARE CURSOR CURSOR_NAME IS 
              SELECT COLUMN_C, COLUMN_D FROM TABLE_B
    BEGIN
            FOR I IN CURSOR_NAME LOOP
            INSERT INTO TABLE_A
            (COLUMN_A,COLUMN_B)
            VALUES(I.COLUMN_C, I.COLUMN_D);
            END LOOP;
     END;
END;

 

몰라서 한참 찾았는데 해결방법이 너무쉬워서 허탈하다.

PL/SQL공부를 해야할듯.

반응형