테이블 데이터를 TXT로 생성관련 질문입니다... 0 0 465

by 김대광 [2019.06.13 17:57:19]


SRC_TABLE_LIST.SQL (1,077Bytes)

안녕하세요...

utl_file을 활용해서 테이블 데이터를 txt 로 생성하는 프로시저를 작성중에 있습니다...

특정 디렉토리에 오라클 사전에서 조회한 테이블과 컬럼명을 추출해놓은 SRC_TABLE_LIST.SQL 파일을 읽어서

루프를 돌면서 해당 테이블의 데이터를 텍스트 파일로 생성하는 프로시저인데요...

컬럼구분자 '///' SRC_TABLE_LIST 파일을 읽어오는것까지는 되었는데요...

TXT 생성시 아래 51번줄부터 61번줄까지 execute immedaite 부분에서 오류가 나네요...

저 부분을 어떻게 바꿔야 할지 궁금합니다.

도와주세요...



CREATE OR REPLACE PROCEDURE PRCD_TBL_DATA_EXTC_R_T
AS

   V_READ_OUTPUT	    UTL_FILE.FILE_TYPE;
   V_WRITE_OUTPUT	    UTL_FILE.FILE_TYPE;
   V_READ_FILE  	    VARCHAR2(32767);
   V_READ_FILE_NAME     VARCHAR2(4000) := 'SRC_TABLE_LIST';       -- 읽을 파일명
   V_READ_EXTS          VARCHAR2(4000) := 'SQL';                  -- 읽을 파일 확장자명
   V_DIR_SQL		    VARCHAR2(50)   := 'EXTR_DIR_SQL';         -- 읽을 SQL 디렉토리 명
   V_READ_BUFFER        VARCHAR2(32767);
   V_OWNER              VARCHAR2(32767);
   V_TABLE_NAME         VARCHAR2(32767);
   V_READ_SQL           VARCHAR2(32767);
   V_WRITE_FILE  	    VARCHAR2(32767);
   V_WRITE_EXTS         VARCHAR2(4000) := 'TXT';                  -- 저장할 파일 확장자명
   V_DIR_TXT		    VARCHAR2(50)   := 'EXTR_DIR_TXT';         -- 저장할 TXT 디렉토리 명
   V_WRITE_BUFFER       VARCHAR2(32767);
   V_WRITE_RESULT       VARCHAR2(32767);


-- 파일 읽기
BEGIN

    V_READ_FILE := V_READ_FILE_NAME || '.' || V_READ_EXTS;

    V_READ_OUTPUT := UTL_FILE.FOPEN ( V_DIR_SQL, V_READ_FILE, 'R', 32767 );

    IF UTL_FILE.IS_OPEN ( V_READ_OUTPUT ) THEN

      LOOP

          BEGIN

             UTL_FILE.GET_LINE ( V_READ_OUTPUT, V_READ_BUFFER );

             V_OWNER      := REGEXP_SUBSTR(V_READ_BUFFER, '[^///]+', 1, 1);
             V_TABLE_NAME := REGEXP_SUBSTR(V_READ_BUFFER, '[^///]+', 1, 2);
             V_READ_SQL   := REGEXP_SUBSTR(V_READ_BUFFER, '[^///]+', 1, 3);

             DBMS_OUTPUT.PUT_LINE ( V_READ_SQL );

             -- 파일 쓰기
             LOOP

                V_WRITE_FILE := V_OWNER || '_EXTR_' || V_TABLE_NAME || '.' || V_WRITE_EXTS;

                DBMS_OUTPUT.PUT_LINE ( V_WRITE_FILE );

                V_WRITE_OUTPUT := UTL_FILE.FOPEN ( V_DIR_TXT, V_WRITE_FILE, 'W', 32767 );

                LOOP

                   DBMS_OUTPUT.PUT_LINE ( V_READ_SQL );

                   UTL_FILE.GET_LINE ( V_WRITE_OUTPUT, V_READ_SQL );

                   EXECUTE IMMEDIATE V_READ_SQL;

                   UTL_FILE.PUT_LINE ( V_WRITE_OUTPUT, V_WRITE_BUFFER );

                END LOOP;

             END LOOP;

             UTL_FILE.FCLOSE ( V_WRITE_OUTPUT );

          EXCEPTION
             WHEN NO_DATA_FOUND THEN 
                  NULL;
                  DBMS_OUTPUT.PUT_LINE ( 'NO_DATA_FOUND' ); 
                  UTL_FILE.FCLOSE ( V_WRITE_OUTPUT );
                  DBMS_OUTPUT.PUT_LINE ( 'SQLCODE : ' || SQLCODE );
                  DBMS_OUTPUT.PUT_LINE ( 'SQLERRM : ' || SQLERRM );
             WHEN UTL_FILE.INVALID_FILEHANDLE THEN
                  NULL;
                  DBMS_OUTPUT.PUT_LINE ( 'INVALID_FILEHANDLE' );
                  UTL_FILE.FCLOSE ( V_WRITE_OUTPUT );
                  DBMS_OUTPUT.PUT_LINE ( 'SQLCODE : ' || SQLCODE );
                  DBMS_OUTPUT.PUT_LINE ( 'SQLERRM : ' || SQLERRM );
             WHEN UTL_FILE.READ_ERROR THEN
                  NULL;
                  DBMS_OUTPUT.PUT_LINE ( 'READ_ERROR' );
                  UTL_FILE.FCLOSE ( V_WRITE_OUTPUT );
                  DBMS_OUTPUT.PUT_LINE ( 'SQLCODE : ' || SQLCODE );
                  DBMS_OUTPUT.PUT_LINE ( 'SQLERRM : ' || SQLERRM );

          END;

      END LOOP;

    END IF;

    UTL_FILE.FCLOSE ( V_READ_OUTPUT );

EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE ( 'ERR CODE : ' || 'PRCD_TBL_DATA_EXTC_R_ERROR' );
      DBMS_OUTPUT.PUT_LINE ( 'SQLCODE : ' || SQLCODE );
      DBMS_OUTPUT.PUT_LINE ( 'SQLERRM : ' || SQLERRM );
      UTL_FILE.FCLOSE_ALL;

END;
/
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입