如何将 DBMS_OUTPUT.GET_LINES 转换为 VARCHAR2?
How to convert DBMS_OUTPUT.GET_LINES to VARCHAR2?
当使用 DBMS_OUTPUT.GET_LINES 结果为 DBMS_OUTPUT.CHARARR 时,如何将其转换为 varchar2?我想使用 DBMS_OUTPUT.GET_LINES 获取我所有的 DBMS_PUTLINE 语句并将它们 return 作为字符串传递给调用程序。
数据库:Oracle 12c
PLSQL Version:Version 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;
试试这个:
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 传递给任何过程或函数。
从评论来看,您似乎只是在寻找一种方便的方法来将 DBMS_OUTPUT 缓冲区提取到您的 Java 应用程序中。虽然有一些方法可以将 SQL 类型发布为 Java-compatible 数组(我不是 Java 开发人员,所以我会把它留给其他人——但请注意 dbms_output.get_lines
已过载return 一个 dbmsoutput_linesarray
可能比 dbms_output.chararray
更容易使用),我想到引用游标可能会起作用。
如果是这样,您可以创建一个函数,return将输出缓冲区作为集合:
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;
现在您可以发出正常的 SQL 查询
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.
(set serveroutput off
只是为了阻止 SQL*Plus 在调用结束时执行自己的 dbms_output.get_lines
并让我的函数无事可做。dbms_output.enable
是因为 set serveroutput off
禁用了 dbms_output。这些仅用于 SQL*Plus 中的演示目的,您在 Java 中不需要它们中的任何一个。)
当使用 DBMS_OUTPUT.GET_LINES 结果为 DBMS_OUTPUT.CHARARR 时,如何将其转换为 varchar2?我想使用 DBMS_OUTPUT.GET_LINES 获取我所有的 DBMS_PUTLINE 语句并将它们 return 作为字符串传递给调用程序。
数据库:Oracle 12c
PLSQL Version:Version 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;
试试这个:
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 传递给任何过程或函数。
从评论来看,您似乎只是在寻找一种方便的方法来将 DBMS_OUTPUT 缓冲区提取到您的 Java 应用程序中。虽然有一些方法可以将 SQL 类型发布为 Java-compatible 数组(我不是 Java 开发人员,所以我会把它留给其他人——但请注意 dbms_output.get_lines
已过载return 一个 dbmsoutput_linesarray
可能比 dbms_output.chararray
更容易使用),我想到引用游标可能会起作用。
如果是这样,您可以创建一个函数,return将输出缓冲区作为集合:
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;
现在您可以发出正常的 SQL 查询
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.
(set serveroutput off
只是为了阻止 SQL*Plus 在调用结束时执行自己的 dbms_output.get_lines
并让我的函数无事可做。dbms_output.enable
是因为 set serveroutput off
禁用了 dbms_output。这些仅用于 SQL*Plus 中的演示目的,您在 Java 中不需要它们中的任何一个。)