javatoyou 发表于 2013-2-1 11:45:10

解决“以非sys用户使用CREATE OR REPLACE DIRECTORY”问题

今天集成调试中发现当以非sys用户使用CREATE OR REPLACE DIRECTORY一般会提示权限不足!需要GRANT ANY CREATE DIRECTORY TO MYUSER;
(P_QUERY_SQL IN VARCHAR2,P_FILE_DIR IN VARCHAR2,P_FILE_NAME IN VARCHAR2,P_COLUMN_LIST IN VARCHAR2 DEFAULT NULL)ASV_FILE UTL_FILE.FILE_TYPE;V_RESULT VARCHAR2(32767);C_RESULT SYS_REFCURSOR;BEGIN/*Oracle 10g 版本*/V_RESULT:='CREATE OR REPLACE DIRECTORY D_OUTPUT AS '''||P_FILE_DIR||'''';execute immediate V_RESULT;V_FILE := UTL_FILE.FOPEN('D_OUTPUT', P_FILE_NAME,'W', 32767);/*Oracle 9i版本**前提是必须将utl_file_dir参数指定为*:**修改\pfile\init.ora文件在最后加上**重启数据库V_FILE := UTL_FILE.FOPEN(P_FILE_DIR, P_FILE_NAME,'W',32767);*/IF P_COLUMN_LIST IS NOT NULL THEN    UTL_FILE.PUT_LINE(V_FILE, P_COLUMN_LIST);END IF;OPEN C_RESULT FOR P_QUERY_SQL;LOOP    FETCH C_RESULT INTO V_RESULT;    EXIT WHEN C_RESULT%NOTFOUND;    UTL_FILE.PUT_LINE(V_FILE, V_RESULT);END LOOP;UTL_FILE.FCLOSE(V_FILE);END;另附:
CREATE DIRECTORY基本使用如下

目录创建

            
create or replace directory exp_dir as '/tmp';                  
读写权限授予特定用户
            
grant read, write on directory dir to myuser;                  

让我们看一个简单的测试:
            
SQL> create or replace directory UTL_FILE_DIR as 'C:/xxx';Directory created.SQL> declare2    fhandle utl_file.file_type;3begin4    fhandle := utl_file.fopen('UTL_FILE_DIR', 'example.txt', 'w');5    utl_file.put_line(fhandle , 'write one');6    utl_file.put_line(fhandle , 'write two');7    utl_file.fclose(fhandle);8end;9/PL/SQL procedure successfully completed.                  
读取文件:
            SQL> declare2    fhandle   utl_file.file_type;3    fp_buffer varchar2(4000);4begin5    fhandle := utl_file.fopen ('UTL_FILE_DIR','example.txt', 'R');6    7    utl_file.get_line (fhandle , fp_buffer );8    dbms_output.put_line(fp_buffer );9    utl_file.get_line (fhandle , fp_buffer ); 10    dbms_output.put_line(fp_buffer ); 11    utl_file.fclose(fhandle); 12end; 13/                  
查看directory.
            
SQL> select * from dba_directories;                  
删除路径.
            
SQL> drop directory exp_dir;Directory dropped                  
页: [1]
查看完整版本: 解决“以非sys用户使用CREATE OR REPLACE DIRECTORY”问题