每个循环创建一个CSV文件PLSQL Oracle SQL Developer

时间:2018-02-20 20:12:53

标签: database oracle plsql etl

更新

抗辐射人们!

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列创建临时表,以使用RowCount记录DB中的所有表
  • 表格在临时表中插入的名称必须是非临时的且行数超过0

下一部分

  • 声明3个变量:2个整数和一个varchar
  • 2整数:1是循环的计数器。 1记录Temp表中的总行数,它将作为循环中的最大迭代次数。
  • Varchar:Nmbre将在临时表中记录第一个表名的名称。

下一段

  • 使用变量Nmbre动态命名CSV文件
  • ,进入以下路径
  • 使用变量Nmbre动态选择表
  • 的假脱机查询
  • 从临时表中删除第1行[用于旋转到下一个表名]
  • 假脱机
  • 循环
  • 结束循环;端;

我哪里错了?另外,我收到此错误:

奖金回合:受限于SQL Developer

1 个答案:

答案 0 :(得分:0)

这是使用SQLcl的选项。 SQLcl是SQLDEV的内容,但是包含在cmd行中。也是java的核心java的脚本功能可用。这是使用JavaScript作为脚本引擎。

我们在github上有一些doc和很多关于如何解决这个问题的例子: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();

    }
 }
/