sql >> データベース >  >> RDS >> Oracle

SQLPlus-PL/SQLブロックから複数のファイルへのスプーリング

    解決策がありました。なぜ私がこれを早く考えなかったのかわかりません...

    基本的な考え方は、マスターsqplplusスクリプトが、出力を複数のファイルに分割する中間スクリプトを生成することです。中間スクリプトを実行すると、rownumに異なる範囲が課された複数のクエリが実行されます 、クエリごとに異なるファイルにスプールします。

    set termout off
    set serveroutput on
    set echo off
    set feedback off
    variable v_rowCount number;
    spool intermediate_file.sql
    declare
         i number := 0;
         v_fileNum number := 1;
         v_range_start number := 1;
         v_range_end number := 1;
         k_max_rows constant number := 65536;
    begin
        dbms_output.enable(10000);
        select count(*) 
        into :v_err_count
        from ...
        /* You don't need to see the details of the query... */
    
        while i <= :v_err_count loop
    
              v_range_start := i+1;
              if v_range_start <= :v_err_count then
                i := i+k_max_rows;
                v_range_end := i;
    
                dbms_output.put_line('set colsep ,  
    set pagesize 0
    set trimspool on 
    set headsep off
    set feedback off
    set echo off
    set termout off
    set linesize 4000
    spool large_data_file_'||v_fileNum||'.csv
    select data_string
    from (select rownum rn, data_object
          from 
          /* Details of query omitted */
         )
    where rn >= '||v_range_start||' and rn <= '||v_range_end||';
    spool off');
              v_fileNum := v_fileNum +1;
             end if;
        end loop;
    end;
    /
    spool off
    prompt     executing intermediate file
    @intermediate_file.sql;
    set serveroutput off
    


    1. EclipseでGlassfishサーバーを手動で構成する方法

    2. MariaDBでEXTRACTVALUE()がどのように機能するか

    3. PostgreSQLのすべてのデータベースのサイズを取得する(psql)

    4. Oracle®SQL*Loaderを使用したSQLServerデータの挿入