2014-01-13 3 views
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 

,하지만 여전히 나는이 문제를 해결하는 방법을 확실하지 않다?

+3

디렉토리는 Oracle의 디렉토리입니다. dba_directories 또는 all_directory 뷰에서 동일하게 확인할 수 있습니다. Unix Directory와 혼동하지 마십시오. mkdir 명령을 사용하여 unix 디렉토리를 작성해야하며, ULT_FILE 조작을 수행하려면이 unix 디렉토리 manully에 파일을 배치해야합니다. – San

+0

읽기 작업을 수행해야하는 경우 파일을 배치해야하지만, 예를 들어 새 파일을 쓰고 싶다면 파일을 둘 필요없이 Unix 디렉토리를 수동으로 작성하십시오. – San

+0

@San 그래서 'DIRECTORY LOGDIR AS'~/log '를 CREATE하거나 바꿀 필요가 없다는 뜻입니다. scott에 디렉터리 로깅을 쓰도록 허락합니다; –

답변

0

오라클 디렉토리 LOGDIR은 '~/log'폴더에 지정된 이름입니다. 이제 운영 체제는 '~/log'라는 이름으로이 로그 폴더를 식별하지만 Oracle은 LOGDIR 이름으로 동일한 폴더를 식별합니다. 따라서 홈 디렉토리에 폴더 로그를 작성한 다음 CREATE를 사용하여 Oracle 디렉토리를 작성하거나 DIRECTORY LOGDIR AS '~/log'를 대체하여 ~/log location을 LOGDIR로 식별 할 수 있음을 oracle에 알리십시오. 둘 다 필요합니다. - San