美文网首页
oracle 11g转成CSV格式数据

oracle 11g转成CSV格式数据

作者: 一杭oneline | 来源:发表于2019-12-10 18:22 被阅读0次

    目的:将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。

    相关文章

      网友评论

          本文标题:oracle 11g转成CSV格式数据

          本文链接:https://www.haomeiwen.com/subject/nqgggctx.html