需要有关使用 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 [重复]

每个将表名传递给过程的 ORACLE PL/SQL

构建一些动态查询选择并立即在 Oracle PL/SQL 中显示其输出

执行动态 PL/SQL 块以执行求和并返回值

PL/SQL 插入和分区

在 PL/SQL 中动态声明变量