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

このスクリプトを実行すると、ディレクトリが正常に作成されたことを示す以下の出力が表示されます。ただし、メッセージで同じことが確認されているにもかかわらず、ホームディレクトリを確認したときにディレクトリが作成されません。

Directory created.

Grant succeeded.

-29283,ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line
536
ORA-29283: invalid file operation

ディレクトリのパスを受け入れない UTL_FILE.FOPEN() プロシージャで指定された解決策を実行しましたか? 、しかし、まだこれを修正する方法がわかりませんか?

4

1 に答える 1

0

そうではなく、Oracle ディレクトリの LOGDIR は「~/log」フォルダに付けられた名前です。現在、オペレーティング システムはこのログ フォルダを「~/log」という名前で識別しますが、Oracle は同じフォルダを LOGDIR 名で識別します。そのため、ホーム ディレクトリにフォルダ log を作成し、CREATE を使用して Oracle ディレクトリを作成するか、DIRECTORY LOGDIR AS '~/log' を置き換えることにより、~/log の場所を LOGDIR として識別できることを oracle に伝えます。両方が必要です。- さん

于 2014-11-24T12:54:48.750 に答える