안녕하세요...
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; /