2

任务是获取可更改的表列表。

编写一段 PL/SQL,在执行时将每个表行输出到单独的 csv 文件中。

所以如果有5张桌子。您将获得 5 个包含相关表格数据的 CSV 文件。

CSV 应该是 | 分隔并在每个值周围都有“(以便于导入到 excel)

我所知道的只是表格列表。

因此,将列表加载到过程顶部的数组中,循环遍历此列表并使用 UTL_FILE 逐行输出每一行。

我很想知道每个表是否需要一个游标,或者是否可以动态使用游标来存储每个表的结果。

ps 每个文件还必须包含列标题作为第一行。

甚至可能吗?有一个超过 30 个表的列表,其中一些表有超过 200 列。

所以请出主意:)。

我慢慢地认为这是不可能的。因为我需要一些可以收集所有列名等的动态 SQL。我陷入了困境!

它不能是一个 SQL 脚本并且只是假脱机输出。我们想要做的就是在数组声明中添加或删除表。

4

3 回答 3

2

是的,有可能。看看这个Ask Tom问题,它展示了如何一次处理 1 张桌子。您需要做的就是遍历您的表名数组并为每个表名调用 Tom 的过程。

于 2008-11-26T17:18:34.463 回答
1

首先,Oracle 将所有这些数据存储在您有权访问的视图中。

SELECT * FROM ALL_TAB_COLUMNS 

将为您提供表格的列列表。这将使为文件创建列标题变得简单。

剩下的只是将数据卸载到一个平面文件中。你可以在这里找到食谱。

这是直接指向代码的链接。

于 2008-11-26T17:15:51.163 回答
0

有几种选择。

  1. 您可以使用 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:
  1. 代替预先格式化的文本,创建一个接受 SQL 查询的包,然后使用 DBMS_SQL 包来解析它并提取列名等,并创建文本字符串以再次使用 UTL_FILE 转储。
于 2008-11-26T17:32:05.343 回答