任务是获取可更改的表列表。
编写一段PL / SQL,在执行时将每个表行输出到单独的csv文件中。
所以如果有5个表。您将获得5个包含相关表格数据的CSV文件。
CSV应为|分隔并且“围绕每个值(为了便于导入到excel)
我所知道的只是表格列表。
因此,将列表加载到过程顶部的数组中,遍历此列表并使用UTL_FILE逐行输出每一行。
我想知道每个表是否需要游标,或者是否可以动态使用游标来存储每个表的结果。
P.S。每个文件还必须包含列标题作为第一行。
甚至可能吗?有一个包含30多个表的列表,其中一些表有200多列。
所以想法请:)。
我慢慢地认为这是不可能的。因为我需要一些可以收集所有列名等的动态SQL。我陷入了困境!
它不能是SQL脚本,只是假脱机输出。我们想要做的就是在数组声明中添加或删除表。
答案 0 :(得分:2)
是的,有可能。请查看此Ask Tom问题,该问题显示了如何一次为1个表执行此操作。您需要做的就是遍历您的表名数组,并为每个表名调用Tom的程序。
答案 1 :(得分:1)
首先,Oracle将所有数据存储在您有权访问的视图中。
SELECT * FROM ALL_TAB_COLUMNS
将为您提供表格列的列表。这将使文件的列标题创建变得简单。
其余的只是将数据卸载到平面文件中。您可以找到here的配方。
这是直接指向code的链接。
答案 2 :(得分:0)
Ther有几种选择。
这样的事情:
DECLARE
TYPE IDCurTyp IS REF CURSOR;
fo UTL_FILE.FILE_TYPE;
varRow VARCHAR2(4000);
cur_output IDCurTyp;
BEGIN
fo := UTL_FILE.FOPEN('BILLING_DIR','BillingFile1.csv', 'W', 2000)
OPEN cur_output FOR
'SELECT ''"'' || t1.col1 || ''",'' || t1.col2 || ''","'' || t1.col2 || ''"'' FROM t1'
LOOP
FETCH cur_output INTO varRow;
EXIT WHEN cur_output%NOTFOUND;
UTL_FILE.putf( fo, '%s\n', varRow );
END LOOP;
CLOSE cur_output;
UTL_FILE.FCLOSE( fo );
END: