从过程中获取表输出
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;
【讨论】:
以上是关于从过程中获取表输出的主要内容,如果未能解决你的问题,请参考以下文章