2014-01-13 81 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创建目录的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?给出的解决方案了,但我仍然不知道如何纠正呢?

+3

这里的目录是Oracle的目录。您可以从dba_directories或all_directories视图中进行验证。不要混淆Unix目录。您需要使用mkdir命令创建unix目录,然后您需要将文件手动放入此unix目录以执行ULT_FILE操作。 – San

+0

如果您必须执行读取操作,则需要放置该文件,但在您需要编写新文件的情况下,在这种情况下无需放置任何文件,只需手动创建Unix目录即可。 – San

+0

@San所以你的意思是说不需要'CREATE或者将DIRECTORY LOGDIR AS替换成'〜/ log'; 授予斯科特目录登录日志;'? –

回答

0

不是这样,Oracle目录LOGDIR是给'〜/ log'文件夹的名字。现在,您的操作系统通过名称'〜/ log'来标识此日志文件夹,但Oracle通过LOGDIR名称标识相同的文件夹。因此,在主目录中创建一个文件夹日志,然后告诉oracle可以通过使用CREATE创建一个Oracle目录或将目录LOGDIR替换为'〜/ log'来标识〜/ LOG位置为LOGDIR。两者都是必需的。 - 圣