目的:将oracle HR用户下的所有表导出成csv格式
从网上搜到一个脚本,好用
CREATE OR REPLACE PROCEDURE SQL_TO_CSV(
    P_QUERY IN VARCHAR2, 
    P_DIR IN VARCHAR2,
    P_FILENAME IN VARCHAR2 
)
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;
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;
END;
/
------  请关注最后一个“/”
这个脚本需要在你要导出数据的那个用户下执行!!!比如我的是HR用户
在sys 用户下
---创建导出目录
SQL> create or replace directory OUT_PATH as '/home/oracle/';---后面的目录自己定
SQL> GRANT READ ON DIRECTORY OUT_PATH to HR; 
SQL> GRANT write ON DIRECTORY OUT_PATH to HR;
在HR用户下
 SQL> EXEC sql_to_csv('select * from employees','OUT_PATH','employees.csv');
以上命令均在SQLplus下执行的,在PL/SQL下执行总是报错,并不明白什么原因。
也有更简单的方法

image.png
以上截图是我在linux版本下oracle sqldevelop下的截图,在要导出表上右击,选择导出,相应位置的对号划掉和选上,就可以一张表导出CSV。