簡體   English   中英

每個循環創建一個CSV文件| PLSQL Oracle SQL開發人員

[英]Creating a CSV file per Loop | PLSQL Oracle SQL Developer

更新

鄉親們!

TL; DR

需要工作代碼來遍歷我所有表的現有列表,這些列表將創建CSV文件,並選擇每個表的前100行。 設置了一些變量來捕獲表名,這些變量將用於動態地調用表,進行選擇並命名文件。 必須通過PLSQL和SQLDeveloper完成。 你知道嗎?

情況如下:

  • 必須收集所有表(非臨時基表)和行數(行數> 0)
  • 創建一個循環以從表列表中選擇(*)前100行
  • 獲取查詢結果並將其放在CSV文件中

問題:

  • 聲明變量
  • 使用開始和結束
  • 使用動態名稱生成唯一的CSV文件

這是我的代碼:

CREATE GLOBAL TEMPORARY TABLE NameRow (nom VARCHAR2(100), rowc INTEGER)
  on commit delete ROWS;
  insert into NameRow(nom, rowc) select table_name, num_rows from user_tables where temporary = 'N' and num_rows > 0;
    --select * from namerow;
    --select count(nom) from namerow;
    --drop table namerow;
    --no need for the row count > 0 because that was already done above
 declare
  counter number := 0;
  totalrecords number := 0;
  nmbre varchar2(100);
 BEGIN

    Select count(nom) into totalrecords from namerow;
    WHILE counter <= totalrecords LOOP
      select nom into nmbre from NameRow where rownum =1;
    SET SPOOL ON
    SPOOL c:\Users\l.r.enchaustegui\Documents\reporepo\||nmbre||.csv
    select /*csv*/ * from HR.nmbre;
    SET SPOOL OFF 
        delete from namerow where rownum=1;
        counter := counter + 1;
    End loop;
 END;

代碼說明:

  • 使用varchare和integer列創建一個臨時表,以記錄DB中具有RowCount的所有表
  • 臨時表中插入的表名必須是非臨時的,並且行數超過0

下一段

  • 聲明3個變量:2個整數和一個varchar
  • 2個整數:1是循環的計數器。 1將記錄在Temp表中的總行數用作循環中的最大迭代次數。
  • Varchar:Nmbre將在臨時表中記錄第一個表的名稱。

下一段

  • 后台處理到以下路徑,使用變量Nmbre動態命名CSV文件
  • 假脫機查詢使用變量Nmbre動態選擇表
  • 從臨時表中刪除第一行[用於輪換到下一個表名]
  • 假脫機
  • 結束循環; 結束;

我哪里錯了? 另外,我收到此錯誤:

獎金回合:限於SQL Developer

這是使用SQLcl的選項。 SQLcl是SQLDEV的膽量,但包裝到cmd行中。 同樣是Java,也可以使用核心Java的腳本編寫能力。 這使用JavaScript作為腳本引擎。

我們在github上有一些文檔和許多示例說明了這些工作原理: https//github.com/oracle/oracle-db-tools/tree/master/sqlcl

script
 var binds = {};

// get complete list of tables
 var tables = util.executeReturnList("select table_name from user_tables", binds);

 for (i = 0; i < tables.length; i++) {
   // get count of rows
    var rows = util.executeReturnOneCol('select count(1)  from ' +  tables[i].TABLE_NAME );
    ctx.write( tables[i].TABLE_NAME + ">>"  + rows + " \n" ) ;

    // if more than zero dump to a csv file
    if ( rows > 0 ){
        sqlcl.setStmt("set sqlformat csv ")
        sqlcl.run();
        sqlcl.setStmt("spool " + tables[i].TABLE_NAME + ".csv")
        sqlcl.run();

        sqlcl.setStmt("select * from  " + tables[i].TABLE_NAME )
        sqlcl.run();
        sqlcl.setStmt("spool off")
        sqlcl.run();

    }
 }
/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM