需要有关使用 PL/SQL 以动态方式将表数据输出到 CSV 的想法
Posted
技术标签:
【中文标题】需要有关使用 PL/SQL 以动态方式将表数据输出到 CSV 的想法【英文标题】:Need ideas on outputting table data to a CSV using PL/SQL in a dynamic fashion 【发布时间】:2008-11-26 17:11:43 【问题描述】:任务是获取可更改的表列表。
编写一段 PL/SQL,在执行时将每个表的行输出到单独的 csv 文件中。
所以如果有 5 张桌子。您将获得 5 个包含相关表格数据的 CSV 文件。
CSV 应该是 |分隔并在每个值周围都有“(以便于导入到 excel)
我只知道表格列表。
因此,将列表加载到过程顶部的数组中,循环遍历此列表并使用 UTL_FILE 逐行输出每一行。
我很想知道是否需要每个表都有一个游标,或者是否可以动态使用游标来存储每个表的结果。
附言每个文件还必须包含列标题作为第一行。
这甚至可能吗?有一个超过 30 个表的列表,其中一些表有超过 200 列。
请给点意见:)。
我慢慢地认为这是不可能的。因为我需要一些可以收集所有列名等的动态 SQL。我陷入了困境!
它不能是一个 SQL 脚本并且只是假脱机输出。我们想要做的就是在数组声明中添加或删除表。
【问题讨论】:
【参考方案1】:是的,这是可能的。看看这个Ask Tom 问题,它展示了如何一次处理一张桌子。您需要做的就是遍历您的表名数组并为每个表名调用 Tom 的过程。
【讨论】:
【参考方案2】:首先,Oracle 将所有这些数据存储在您有权访问的视图中。
SELECT * FROM ALL_TAB_COLUMNS
将为您提供表格的列列表。这将使为文件创建列标题变得简单。
剩下的只是将数据卸载到一个平面文件中。你可以找到 here 的食谱。
这是直接指向code 的链接。
【讨论】:
【参考方案3】:有多种选择。
-
您可以使用 UTL_FILE 将预先格式化的文本字符串转储到文件中。只需制作一个游标,输出所有数据列并用分隔符连接即可。
类似这样的:
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:
-
创建一个接受 SQL 查询的包而不是预格式化文本,然后使用 DBMS_SQL 包对其进行解析并提取列名等,并再次使用 UTL_FILE 创建要转储的文本字符串。
【讨论】:
以上是关于需要有关使用 PL/SQL 以动态方式将表数据输出到 CSV 的想法的主要内容,如果未能解决你的问题,请参考以下文章
动态 SQL/异常处理 -00942 - Oracle PL/SQL [重复]