每个循环创建一个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进行假脱机查询以动态选择表
- 从临时表中删除第一行[用于轮换到下一个表名]
- 假脱机
- 循环
- 结束循环;结束;
我在哪里错了?另外,我收到此错误:
Where am I wrong? Also, I am getting this error:
奖金回合:仅限于SQL Developer
Bonus Round: Constrained to SQL Developer
推荐答案
以下是使用SQLcl的选项. SQLcl是SQLDEV的胆量,但包装到cmd行中.同样是Java,核心Java的脚本编写功能也是可用的.这是使用JavaScript作为脚本引擎.
Here's an option using SQLcl. SQLcl is the guts of SQLDEV but wrappered into a cmd line. Also being java the scripting abilities of core java is available. This is using JavaScript as the scripting engine.
我们在github上有一些文档以及很多示例说明了这些方法: https://github.com/oracle/oracle-db-tools/tree/master/sqlcl
We have some doc and lots of example of how this all works out on github here: 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();
}
}
/
这篇关于每个循环创建一个CSV文件| PLSQL Oracle SQL开发人员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!