programing

긴 길이를 Varchar2로 변환

itmemos 2023. 8. 15. 10:49
반응형

긴 길이를 Varchar2로 변환

긴 열에서 varchar2 열에 삽입하려고 합니다.다음은 예입니다.TEXT.TEXT_COL = VARCHAR2(4000)그리고.NOTE.TEXT_NOTE = LONG.

INSERT INTO TEXT(ROW_ID, TEXT_COL)
SELECT 1, TEXT_NOTE FROM NOTE; 

위의 SQL을 실행하면 오류가 발생합니다.

SQL 오류: ORA-00997: LONG 데이터 유형의 잘못된 사용

사용한TO_LOB()역시, 하지만 여전히 같은 오류입니다.

간단히 커버할 수 있는 기능이 있습니까?long그리고 그것을 넣습니다.varchar2당신의 생각을 알려주세요.

변환 대상long로.varchar2단일 문을 바로 사용하는 것은 불가능합니다.long에는 특정한 제한이 있습니다.

임시 테이블을 만들거나 PL/SQL 코드를 사용하여 문제를 해결할 수 있습니다.

  • 임시 테이블:

    CREATE TABLE TABLE2 AS SELECT TO_LOB(COLUMN1) COLUMN FROM TABLE1;

  • PL/SQL 코드:

    DECLARE
      VAR1 LONG;
      VAR2 VARCHAR2(4000);
    BEGIN
      SELECT TEXT INTO VAR1 FROM USER_VIEWS WHERE ROWNUM = 1;  
      VAR2 := SUBSTR(VAR1, 1, 4000);
      DBMS_OUTPUT.PUT_LINE(VAR2);
    END;
    

루프에서 LONG을 선택하면 Oracle이 내부적으로 LONG을 다른 것(아마도 CLOB)으로 변환하는 것처럼 보입니다.Oracle 설명서에서 아무런 설명도 찾지 못했지만 이는 작동합니다.

BEGIN
  FOR V IN (SELECT ROWID,TEXT_NOTE FROM NOTE)
  LOOP
    INSERT INTO TEXT VALUES(V.ROWID, SUBSTR(V.TEXT_NOTE, 1, 4000) );   
  END LOOP;
  COMMIT;
END;

다음은 다른 스키마의 모든 보기를 스키마로 복사하는 방법의 예입니다.

BEGIN
  FOR V IN (SELECT VIEW_NAME, TEXT_LENGTH, TEXT FROM ALL_VIEWS WHERE OWNER = 'PROD')
  LOOP
    EXECUTE IMMEDIATE 'CREATE OR REPLACE FORCE VIEW '||V.VIEW_NAME||' AS '||SUBSTR(V.TEXT, 1, V.TEXT_LENGTH);
    DBMS_OUTPUT.PUT_LINE('View '||V.VIEW_NAME||' created');
  END LOOP;
END;

어떤 이유로 인해 FOR 루프에서만 작동하며 WITH를 사용하거나 다른 쿼리에서 선택하면 작동하지 않습니다.

INSERT INTO TEXT
WITH V AS(SELECT ROWID ROW_ID,TEXT_NOTE FROM NOTE)
SELECT V.ROW_ID, SUBSTR(V.TEXT_NOTE, 1, 4000) FROM V; 

INSERT INTO TEXT
SELECT ROW_ID, SUBSTR(TEXT_NOTE, 1, 4000) 
FROM (SELECT ROWID ROW_ID,TEXT_NOTE FROM NOTE); 

두 인서트 모두 동일한 오류가 발생

ORA-00932: 일관성 없는 데이터 유형: 예상된 CHAR이 길어졌습니다.

표준 함수를 사용하여 long을 varchar2로 변환할 수 있습니다.

sys.DBMS_METADATA_UTIL.long2varchar

또는 클로브:

sys.DBMS_METADATA_UTIL.long2clob

언급URL : https://stackoverflow.com/questions/31004844/converting-long-to-varchar2

반응형