如何从Oracle存储过程查看TOAD中的CLOB输出参数?

时间:2013-10-29 05:18:31

标签: sql oracle stored-procedures toad clob

我在Oracle数据库的包中有一个存储过程,它有2个输入参数+ 1个输出CLOB参数。如何在Toad中查看输出? (最好是用户只有执行/选择权限)

解决方案:

DECLARE
   my_output_parameter CLOB;
BEGIN 
   my_package.my_stored_proc(1, 2, my_output_parameter);
   DBMS_OUTPUT.PUT_LINE(my_output_parameter);
END;

不要忘记以脚本执行,而不仅仅是执行语句,结果显示在DBMS输出窗口中,而不是数据网格。

3 个答案:

答案 0 :(得分:1)

我猜DBMS_OUTPUT.PUT_LINE的内部行限制为255个字符。但是它已从10g Release 2中删除。您可以尝试在表中插入列数据,稍后通过查询该表来查看它。

请参阅 -

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:146412348066

答案 1 :(得分:1)

您会考虑将CLOB打印为结果集吗?然后,您可以使用PIPELINED函数(此处更多关于它们:PIPELINED functions by Tim Hall),它将逐行返回CLOB,请看下面的示例:

CREATE TABLE my_clob_tab (
  id NUMBER,
  clob_col CLOB
)
/

INSERT INTO my_clob_tab
  VALUES (1,
          to_clob('first line' || chr(10) ||
          'second line, a longer one' || chr(10) ||
          'third'))
/

CREATE OR REPLACE TYPE t_my_line_str AS TABLE OF VARCHAR2(2000)
/

CREATE OR REPLACE FUNCTION print_clob_func(p_id IN NUMBER)
  RETURN t_my_line_str PIPELINED
AS
  v_buffer VARCHAR2(32767);
  v_clob CLOB;
  v_len NUMBER;
  v_offset NUMBER := 1;
  v_line_break_pos NUMBER;
  v_amount NUMBER;
BEGIN
  SELECT clob_col
    INTO v_clob
  FROM my_clob_tab
  WHERE id = p_id;

  IF v_clob IS NOT NULL THEN
    v_len := dbms_lob.getlength(v_clob);

    WHILE v_offset < v_len
    LOOP
      v_line_break_pos := instr(v_clob, chr(10), v_offset);

      IF v_line_break_pos = 0 THEN
        v_amount := v_len - v_offset + 1;
      ELSE
        v_amount := v_line_break_pos - v_offset;
      END IF;

      dbms_lob.read(v_clob, v_amount, v_offset, v_buffer);
      v_offset := v_offset + v_amount + 1;

      PIPE ROW (v_buffer);      
    END LOOP;
  END IF;
END;
/

(可以更改该功能,使其从您的程序中获取CLOB作为参数)

代码逐行读取CLOB的内容(我假设行分隔符为CHR(10) - 如果您在Windows上,则可以将其更改为CHR(10) || CHR(13))和PIPE语句的每一行SELECT

读取clob的函数也可以通过dbms_output.put_line将输出打印到标准输出,但是它会更复杂,因为你必须考虑到标准输出的最大行长度是有限的,纠正我,如果我错了,2000个字符,但它是可行的(不幸的是现在不能尝试解决方案)。同时,请检查以上建议,如果这对您有用,请给我一些反馈。

回到解决方案,现在我们可以发出这个SELECT声明:

SELECT COLUMN_VALUE AS clob_line_by_line FROM TABLE(print_clob_func(1));

这会给我们以下输出:

CLOB_LINE_BY_LINE
-------------------------
first line
second line, a longer one
third

在SQLFiddle上查看:SQLFiddle example

答案 2 :(得分:1)

插入PL / SQL块和dbms_output

的方法
DECLARE
   my_output_parameter CLOB;
BEGIN 
   my_package.my_stored_proc(1, 2, my_output_parameter);

  declare 
    vClob CLOB := my_output_parameter;
    vPos  number;
    vLen  number;
  begin
    vLen := DBMS_LOB.GetLength(vClob);
    vPos := 1;
    while vPos < vLen loop
      DBMS_OUTPUT.Put(DBMS_LOB.Substr(vCLOB, 200, vPos));
      vPos := vPos + 200;  
    end loop;
    DBMS_OUTPUT.new_line;
  end;

END;