ORACLEはCSV形式のデータを書き出します

2687 ワード

navicateなどの可視化ツールを使用して、plsqlはCSVファイルをエクスポートすることもできますが、シーンの簡単なエクスポートでは適用されません.たとえば、テーブルのデータをフィールドごとに複数のファイルにエクスポートするには、次の手順に従います.


  • エクスポートツールSPを新規作成し、クエリーSQL、エクスポートディレクトリ、ファイル名を入力してエクスポートします.
    CREATE OR REPLACE PROCEDURE SQL_TO_CSV
    (
     P_QUERY IN VARCHAR2, -- PLSQL 
     P_DIR IN VARCHAR2, --          
     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;
    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;
    
      DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
    
      UTL_FILE.FCLOSE(L_OUTPUT);
    EXCEPTION
      WHEN OTHERS THEN
        RAISE;
    END;
    


  • 必要に応じて、論理のエクスポートとデータのエクスポートを準備します.
    CREATE OR REPLACE 
    PROCEDURE  MY_EXPORT AS
    
    V_FILE_NAME VARCHAR2(300) := '';
    BEGIN
    --         
    FOR A  IN (
      SELECT ID ,NAME FROM A
    )
    LOOP 
        --   
        V_FILE_NAME := A.ID|| '_'|| A.NAME||'.csv';
        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP';
        commit;
        --TEMP    ,       
        INSERT INTO  TEMP 
    	SELECT * FROM B  WHERE ID  =A.ID;
        commit;
        --       SP,OUT_PATH       ,ORACLE       ,
        --create or replace directory OUT_PATH as'/home/oracle/backup';
       SQL_TO_CSV('SELECT * FROM A','OUT_PATH',V_FILE_NAME);
    END LOOP;
    
    END;