user权限,角色=dba以下是存储过程
CREATE OR REPLACE PROCEDURE SQL_TO_CSV
    (
        P_QUERY IN VARCHAR2,                        -- SQL语句
        P_DIR IN VARCHAR2,                          -- CSV路径(需要写DIRECTORY)
        P_FILENAME IN VARCHAR2                      -- CSV文件名
    )
    IS
        L_OUTPUT UTL_FILE.FILE_TYPE;
        L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
        L_COLUMNVALUE VARCHAR2(4000);
--        L_STATUS INTEGER;
        L_COLCNT NUMBER := 0;
        L_SEPARATOR VARCHAR2(1);
        L_DESCTBL DBMS_SQL.DESC_TAB;
        P_MAX_LINESIZE NUMBER := 32000;
/*
---要创建
CREATE OR REPLACE DIRECTORY MYDIR AS 'C:\';-------MYDIR大写----执行
begin
SQL_TO_CSV
    (
        'SELECT * FROM SCOTT.EMP',     -- SQL语句
        'MYDIR',                       -- CSV路径(需要写DIRECTORY)
        'EMP.CSV'                      -- CSV文件名
    );
end;*/        
    BEGIN
        --OPEN FILE
        L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);        --DEFINE DATE FORMAT
       EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';        --OPEN CURSOR
        DBMS_SQL.PARSE( L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE );
        DBMS_SQL.DESCRIBE_COLUMNS( L_THECURSOR, L_COLCNT, L_DESCTBL );        --DUMP TABLE COLUMN NAME
        FOR I IN 1 .. L_COLCNT LOOP
            UTL_FILE.PUT( L_OUTPUT, L_SEPARATOR || '"' || L_DESCTBL(I).COL_NAME || '"' );
            DBMS_SQL.DEFINE_COLUMN( L_THECURSOR, I, L_COLUMNVALUE, 4000 );
            L_SEPARATOR := ',';
        END LOOP;
        UTL_FILE.NEW_LINE( L_OUTPUT );        --EXECUTE THE QUERY STATEMENT
        --L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);        --DUMP TABLE COLUMN VALUE
        WHILE ( DBMS_SQL.FETCH_ROWS(L_THECURSOR) > 0 ) LOOP
            L_SEPARATOR := '';
            FOR I IN 1 .. L_COLCNT LOOP
                DBMS_SQL.COLUMN_VALUE( L_THECURSOR, I, L_COLUMNVALUE );
                UTL_FILE.PUT( L_OUTPUT, L_SEPARATOR || '"' ||
                TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE,'"','""')) || '"');
                L_SEPARATOR := ',';
            END LOOP;
            UTL_FILE.NEW_LINE( L_OUTPUT );
        END LOOP;        --CLOSE CURSOR
        DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);        --CLOSE FILE
        UTL_FILE.FCLOSE( L_OUTPUT );
    EXCEPTION
        WHEN OTHERS THEN
        RAISE;
        DBMS_OUTPUT.PUT_LINE('输出错误'||SQLCODE||SQLERRM);
    END;

解决方案 »

  1.   

    这个用户角色权限是DBA,登录时连接方式为normal执行上面那存储过程就报权限不足, 登录时连接方式sysdba执行上面那执行存储过程成功,
      

  2.   


    是对目录的权限不够把grant read,write on directory MYDIR to user
      

  3.   

       dba是最大的权限了吧,这样还会权限不足啊?
      

  4.   

      sys有时候也报权限不足!
      

  5.   

    oracle在过程中权限有特殊的控制,必须要有独立的权限,如要CREATE TABLE语句,就要有独立的CREATE TABLE权限,必须GRANT CREATE TABLE TO USEr,其他的上层权限不行,如有DBA,REOURCE等权限也包含CREATE TABLE到他不是独立的CREATE TABLE权限