如何将DBMS_OUTPUT.GET_LINES转换为VARCHAR2?

时间:2017-02-15 23:00:48

标签: plsql plsqldeveloper

使用提供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;

2 个答案:

答案 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传递给任何过程或函数。