0
#! /bin/bash
sqlplus -s /nolog << EOF
conn sys/password as sysdba
CREATE or replace DIRECTORY LOGDIR AS '~/log';
GRANT WRITE ON DIRECTORY LOGDIR TO scott;
connect scott/tiger
set serveroutput on feedback off
CREATE OR REPLACE PROCEDURE SP_ORACLE_2_EXCEL(filename IN VARCHAR2) AS
filehandle UTL_FILE.FILE_TYPE;
filepath VARCHAR2(50);
CURSOR C1 IS SELECT * FROM emp order by deptno;
VARC1 C1%ROWTYPE;
BEGIN
filepath := filename || '_' || SYSDATE || '.csv';
filehandle := UTL_FILE.FOPEN('LOGDIR', filepath, 'W');
utl_file.putf(filehandle,' REPORT :GENERATED ON %s\n',SYSDATE);
utl_file.new_line(filehandle);
UTL_FILE.PUT_LINE(filehandle, 'EMPNO' || ',' || 'ENAME' || ',' || 'DEPTNO');
OPEN C1;
LOOP
FETCH C1 INTO VARC1;
EXIT WHEN C1%NOTFOUND;
UTL_FILE.PUT_LINE(filehandle, '"' || VARC1.empno || '"' || ' ,' || '"' ||
VARC1.ename || '"' || ' ,' || '"' || VARC1.deptno|| '"');
END LOOP;
close C1;
UTL_FILE.FFLUSH(filehandle);
UTL_FILE.FCLOSE(filehandle);
EXCEPTION
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||','||SQLERRM);
END SP_ORACLE_2_EXCEL;
/
execute SP_ORACLE_2_EXCEL('test')
quit
EOF
이 스크립트를 실행할 때 디렉토리가 성공적으로 생성되었다는 아래 출력이 표시됩니다. 그러나 홈 디렉토리를 확인했을 때 디렉토리가 만들어지는 것은 아닙니다.UTL_FILE을 사용하여 Oracle을 통해 디렉토리를 생성하는 쉘 스크립트
나는 UTL_FILE.FOPEN() procedure not accepting path for directory?에 주어진 솔루션을 겪었Directory created.
Grant succeeded.
-29283,ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line
536
ORA-29283: invalid file operation
,하지만 여전히 나는이 문제를 해결하는 방법을 확실하지 않다?
디렉토리는 Oracle의 디렉토리입니다. dba_directories 또는 all_directory 뷰에서 동일하게 확인할 수 있습니다. Unix Directory와 혼동하지 마십시오. mkdir 명령을 사용하여 unix 디렉토리를 작성해야하며, ULT_FILE 조작을 수행하려면이 unix 디렉토리 manully에 파일을 배치해야합니다. – San
읽기 작업을 수행해야하는 경우 파일을 배치해야하지만, 예를 들어 새 파일을 쓰고 싶다면 파일을 둘 필요없이 Unix 디렉토리를 수동으로 작성하십시오. – San
@San 그래서 'DIRECTORY LOGDIR AS'~/log '를 CREATE하거나 바꿀 필요가 없다는 뜻입니다. scott에 디렉터리 로깅을 쓰도록 허락합니다; –