如何将 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 中不需要它们中的任何一个。)