从过程中获取表输出

Posted

技术标签:

【中文标题】从过程中获取表输出【英文标题】:Getting Table Output From Procedure 【发布时间】:2014-09-15 16:01:53 【问题描述】:

我有一个工作过程,它使用DBMS_OUTPUT.put_line 函数输出一个我会考虑的脚本输出。

该过程运行良好,但我只能使用 Toad 系统中的 DBMS 输出行查看结果。我可以使用 CSV 将数据传输到 excel,但是这个过程需要一些时间,理想情况下我希望能够只使用 excel 来运行报告。

我非常有能力运行宏,并且在严格从 Excel 工作簿运行查询之前已连接到我的 Oracle 数据库。问题变成收获 DBMS 输出行格式脚本响应;我只能以“数据网格”格式获取输出——一种表格格式,类似于输出select * from table1

然后我的问题是,Oracle 是否有办法将表格格式的集合从过程输出到数据网格格式?

以下是该过程的示例:

LOOP
      SELECT (CAST (MULTISET (SELECT DECODE (mike.flg, '1', 'No Trailer', DECODE(mike.prod, '1', 'Waiting', mike.txt))
                                FROM (  SELECT *
                                          FROM (  SELECT *
                                                    FROM hist
                                                   WHERE     id = v_array.seq_id
                                                         AND txt IS NOT NULL
                                                         AND txt <> 'NOW'
                                                         AND flg = 1
                                                ORDER BY id DESC) b                                         WHERE ROWNUM <= 1                                      ORDER BY ROWNUM DESC) m) AS wbr.data_1_col_ty))
        INTO v_col
        FROM DUAL;

        --select * from v_col;

      IF v_col IS NOT NULL AND v_col.COUNT > 0
      THEN
         FOR v_index IN v_col.FIRST .. v_col.LAST
         LOOP
                 DBMS_OUTPUT.put_line ();
         END LOOP;
      END IF;
   END LOOP;

我希望能够在执行过程中以表格格式输出来自 v_col 的结果,或者在程序的最后一次输出所有结果。我知道v_array.seq_id 在循环中匹配,但有没有办法在最后以表格格式输出?能够做到这一点应该允许我通过 Excel 宏调用这个脚本并收集结果。

【问题讨论】:

您能提供几个 hist.txt 的样本值吗? v_col 是如何定义的? 【参考方案1】:
CREATE FUNCTION some_fun
  RETURN wbr.data_1_col_ty PIPELINED
IS
LOOP
  SELECT (CAST (MULTISET (SELECT DECODE (mike.flg, '1', 'No Trailer', DECODE(mike.prod, '1', 'Waiting', mike.txt))
                            FROM (  SELECT *
                                      FROM (  SELECT *
                                                FROM hist
                                               WHERE     id = v_array.seq_id
                                                     AND txt IS NOT NULL
                                                     AND txt <> 'NOW'
                                                     AND flg = 1
                                            ORDER BY id DESC) b                                         WHERE ROWNUM <= 1                                      ORDER BY ROWNUM DESC) m) AS wbr.data_1_col_ty))
    INTO v_col
    FROM DUAL;

    --select * from v_col;

  IF v_col IS NOT NULL AND v_col.COUNT > 0
  THEN
     FOR v_index IN v_col.FIRST .. v_col.LAST
     LOOP
        PIPE ROW(v_col(v_index));
     END LOOP;
  END IF;
END LOOP;
END some_fun;

那你就可以了

select * from table(some_fun())

在您的 Excel 文件中。

顺便说一句,您可以使用 PL/SQL 批量绑定功能,而不是选择和强制转换多重集:

  SELECT DECODE (mike.flg, '1', 'No Trailer', DECODE(mike.prod, '1', 'Waiting', mike.txt))
  BULK COLLECT INTO v_col
                            FROM (  SELECT *
                                      FROM (  SELECT *
                                                FROM hist
                                               WHERE     id = v_array.seq_id
                                                     AND txt IS NOT NULL
                                                     AND txt <> 'NOW'
                                                     AND flg = 1
                                            ORDER BY id DESC) b                                         WHERE ROWNUM <= 1                                      ORDER BY ROWNUM DESC) m;

【讨论】:

以上是关于从过程中获取表输出的主要内容,如果未能解决你的问题,请参考以下文章

如何获取存储过程以输出从 SQL*Plus 中的 select 语句返回的表?

sql从多个表中获取值

Excel从存储过程SQL获取参数(而不是表)

如何从 JDBC 中的存储过程中获取输出

使用 JDBC 从存储过程中获取 Oracle 表类型

如何从存储过程中获取输出参数结果和查询结果?