使用UTL_文件通过Oracle创建目录的Shell脚本

使用UTL_文件通过Oracle创建目录的Shell脚本,oracle,shell,stored-procedures,utl-file,Oracle,Shell,Stored Procedures,Utl File,我已经完成了中给出的解决方案,但仍然不确定如何更正此问题 不是这样,Oracle目录LOGDIR是给“~/log”文件夹起的名称。现在,您的操作系统通过名称“~/log”标识此日志文件夹,而Oracle通过LOGDIR名称标识相同的文件夹。因此,在您的主目录中创建一个文件夹日志,然后告诉oracle您可以通过使用create或replace directory LOGDIR作为“~/log”创建一个oracle目录来将~/log位置标识为LOGDIR。两者都是必需的San目录这里是Oracle的

我已经完成了中给出的解决方案,但仍然不确定如何更正此问题

不是这样,Oracle目录LOGDIR是给“~/log”文件夹起的名称。现在,您的操作系统通过名称“~/log”标识此日志文件夹,而Oracle通过LOGDIR名称标识相同的文件夹。因此,在您的主目录中创建一个文件夹日志,然后告诉oracle您可以通过使用create或replace directory LOGDIR作为“~/log”创建一个oracle目录来将~/log位置标识为LOGDIR。两者都是必需的San

目录这里是Oracle的目录。您可以从dba_目录或“所有_目录”视图中进行验证。大学教师;不要与Unix目录混淆。您需要使用mkdir命令创建unix目录,然后手动将文件放入此unix目录以执行ULT_文件操作。如果必须执行读取操作,则需要放置文件,但在您的示例中,您希望写入新文件,在这种情况下,无需放置任何文件,只需手动创建Unix目录。@San您的意思是说不需要将目录LOGDIR创建或替换为“~/log”;将目录LOGDIR上的写操作授予scott?不是这样,Oracle目录
LOGDIR
是为“~/log”文件夹命名的。现在,您的操作系统通过名称“~/log”来标识此日志文件夹,而Oracle通过
LOGDIR
name来标识相同的文件夹。因此,在您的主目录中创建一个文件夹
log
,然后告诉oracle您可以通过使用
create或replace directory LOGDIR作为“~/log”
创建oracle目录,将
~log
位置标识为
LOGDIR
。两者都是必需的。@非常感谢,您的解决方案解决了我的问题:)
#! /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