需要有关使用PL / SQL以动态方式将表格数据输出到CSV的想法

时间:2008-11-26 17:11:43

标签: oracle plsql

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

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

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

CSV应为|分隔并且“围绕每个值(为了便于导入到excel)

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

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

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

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

甚至可能吗?有一个包含30多个表的列表,其中一些表有200多列。

所以想法请:)。

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

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

3 个答案:

答案 0 :(得分:2)

是的,有可能。请查看此Ask Tom问题,该问题显示了如何一次为1个表执行此操作。您需要做的就是遍历您的表名数组,并为每个表名调用Tom的程序。

答案 1 :(得分:1)

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

SELECT * FROM ALL_TAB_COLUMNS 

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

其余的只是将数据卸载到平面文件中。您可以找到here的配方。

这是直接指向code的链接。

答案 2 :(得分:0)

Ther有几种选择。

  1. 您可以使用UTL_FILE将预先格式化的文本字符串转储到文件中。只需创建一个光标,输出与分隔符连接的所有数据列。
  2. 这样的事情:

    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创建要转储的文本字符串。