簡體   English   中英

如何從Oracle存儲過程中查看TOAD中的CLOB輸出參數?

[英]How do I view a CLOB output parameter in TOAD from an Oracle Stored Procedure?

我在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輸出”窗口中,而不是數據網格中。

我猜DBMS_OUTPUT.PUT_LINE的內部行數限制為255個字符。 但是,它已從10g第2版開始刪除。 您可以嘗試將列數據插入表中,稍后通過查詢該表來查看它。

請參考-

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

您是否考慮將CLOB打印為結果集? 然后,您可以使用PIPELINED函數(有關它們的更多信息: Tim Hall的PIPELINED函數 ),它將逐行返回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示例

插入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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM