使用提供DBMS_OUTPUT.CHARARR结果的DBMS_OUTPUT.GET_LINES时,如何将其转换为varchar2?我想使用DBMS_OUTPUT.GET_LINES来获取我的所有DBMS_PUTLINE语句,并将它们作为字符串返回给调用程序。
数据库:Oracle 12c
PLSQL版本:版本11.0.6.1776
declare
-- Non-scalar parameters require additional processing
v_Data DBMS_OUTPUT.CHARARR;
v_NumLines NUMBER;
begin
-- Call the procedure
-- Procedure that will generate DMBS_OUTPUT.PUT_LINEs
executeProcFoo( );
v_NumLines := 1000;
DBMS_OUTPUT.GET_LINES(v_Data, v_NumLines);
FOR v_Counter IN 1..v_NumLines LOOP
--output putlines from get_lines
DBMS_OUTPUT.put_line(v_Data(v_Counter));
END LOOP;
end;
答案 0 :(得分:2)
从评论看来,您似乎只是在寻找一种方便的方法来将DBMS_OUTPUT缓冲区提取到Java应用程序中。虽然有一些方法可以将SQL类型发布为兼容Java的数组(我不是Java开发人员,所以我将其留给其他人 - 但请注意dbms_output.get_lines
已重载并且可以返回{{ 1}}这可能比dbmsoutput_linesarray
更容易使用,我想到一个引用光标可以解决这个问题。
如果是这样,您可以创建一个将输出缓冲区作为集合返回的函数:
dbms_output.chararray
现在您可以发出正常的SQL查询
create or replace function get_dbms_output
return dbmsoutput_linesarray
as
l_output dbmsoutput_linesarray;
l_linecount number;
begin
dbms_output.get_lines(l_output, l_linecount);
if l_output.count > l_linecount then
-- Remove the final empty line above l_linecount
l_output.trim;
end if;
return l_output;
end get_dbms_output;
应该给你一个标准的引用光标。
演示:
select column_value from table(get_dbms_output)
(SQL> set serveroutput off
SQL>
SQL> begin
2 dbms_output.enable;
3 dbms_output.put_line('This is a line');
4 dbms_output.put_line('This is another line');
5 dbms_output.put_line('This is the last line.');
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select column_value from table(get_dbms_output);
COLUMN_VALUE
--------------------------------------------------------
This is a line
This is another line
This is the last line.
3 rows selected.
只是为了阻止SQL * Plus在调用结束时执行自己的set serveroutput off
并让我的函数无事可做。dbms_output.get_lines
是因为{ {1}}禁用dbms_output。这些仅用于SQL * Plus中的演示目的,而您在Java中不需要其中任何一个。)
答案 1 :(得分:0)
试试这个:
DECLARE
-- Non-scalar parameters require additional processing
v_Data DBMS_OUTPUT.CHARARR;
v_NumLines NUMBER;
TYPE v IS TABLE OF VARCHAR2 (1000)
INDEX BY BINARY_INTEGER;
v_var v;
BEGIN
-- Call the procedure
-- Procedure that will generate DMBS_OUTPUT.PUT_LINEs
DBMS_OUTPUT.PUT_LINE ('vvvv');
DBMS_OUTPUT.put_line ('xxxxx');
v_NumLines := 1000;
DBMS_OUTPUT.GET_LINES (v_Data, v_NumLines);
FOR v_Counter IN v_data.FIRST .. v_data.LAST
LOOP
--output putlines from get_lines
DBMS_OUTPUT.put_line (v_Data (v_Counter));
v_var (v_counter) := v_data (v_counter);
END LOOP;
END;
您可以将v_var传递给任何过程或函数。