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创建目录的shell脚本
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() procedure not accepting path for directory?给出的解决方案了,但我仍然不知道如何纠正呢?
这里的目录是Oracle的目录。您可以从dba_directories或all_directories视图中进行验证。不要混淆Unix目录。您需要使用mkdir命令创建unix目录,然后您需要将文件手动放入此unix目录以执行ULT_FILE操作。 – San
如果您必须执行读取操作,则需要放置该文件,但在您需要编写新文件的情况下,在这种情况下无需放置任何文件,只需手动创建Unix目录即可。 – San
@San所以你的意思是说不需要'CREATE或者将DIRECTORY LOGDIR AS替换成'〜/ log'; 授予斯科特目录登录日志;'? –