我有一个工作程序,使用DBMS_OUTPUT.put_line
函数输出a,我会考虑的脚本输出。
该过程完美无缺,但我只能使用Toad系统中的DBMS输出行查看结果。我可以使用CSV将数据传输到excel,但是这个过程需要一些时间,理想情况下我希望只能使用Excel来运行报告。
我非常有能力运行宏并连接到我的Oracle数据库,然后严格地从Excel工作簿运行查询。问题是收获DBMS输出行格式脚本响应;我只能在"数据网格"中收获输出。 format-表格格式,类似于输出select * from table1
。
我的问题是,Oracle是否有办法以表格格式将一个集合从一个过程输出到datagrid格式?
以下是该程序的一个示例:
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宏来调用这个脚本并收集结果。
答案 0 :(得分: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;