2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CLOB型の列 を 1行だけ取得する リテラルSQL を 引数にして、その CLOB型のデータを 2000文字ずつ分解して 複数レコードとして返却する Table Function を作成

Last updated at Posted at 2016-02-27

うーん、タイトルからしてダーティな作りやね 彡(-)(-)

CLOB型の列 を 1行だけ取得する リテラルSQL を 引数にして、
その CLOB型のデータを 2000文字ずつ分解して 複数レコードとして
返却する Table Function を 作成します。

-- Package定義
CREATE OR REPLACE PACKAGE clob_2_mrow_vc2
IS
  -- Table Function が 返す型定義
  TYPE tp_mr_vc2 IS TABLE OF VARCHAR2(4000);
  -- Table Function の 定義
  FUNCTION sql_2_mr_vc2(
      in_v_sql IN VARCHAR2
  )
  RETURN tp_mr_vc2 PIPELINED;
END clob_2_mrow_vc2;
/

-- Package本体の定義
CREATE OR REPLACE PACKAGE BODY clob_2_mrow_vc2
IS
  -- Table Function本体
  FUNCTION sql_2_mr_vc2(
      in_v_sql IN VARCHAR2
  )
  RETURN tp_mr_vc2 PIPELINED
  IS
    -- 変数定義
    rec        VARCHAR2(4000); -- Table Function が 返す行
    c_clob     CLOB;           -- CLOBデータ
    i_length   INTEGER;        -- CLOBデータのバイト数
    i_offset   INTEGER;        -- CLOBデータ操作時のoffset
  BEGIN
    --動的SQLを実行してCLOBを取得
    EXECUTE IMMEDIATE in_v_sql INTO c_clob;
    -- 初期化
    i_length := DBMS_LOB.GETLENGTH(c_clob);
    i_offset := 1;
    --CLOBデータ を 2000文字ずつ 切り出して レコードとして返却
    LOOP
      rec := DBMS_LOB.SUBSTR(c_clob, 2000, i_offset);
      PIPE ROW(rec);
      i_offset := i_offset + 2000;
      EXIT WHEN i_offset > i_length;
    END LOOP;
    RETURN;
  END sql_2_mr_vc2;
END clob_2_mrow_vc2;
/

実行結果は以下の通り。想定通り動いたけど、結局使い道無いやな…彡(-)(-)

SQL> SET LINESIZE 300
SQL> SET PAGESIZE 1000
SQL> SELECT LENGTH(COLUMN_VALUE) FROM TABLE(
  2    clob_2_mrow_vc2.sql_2_mr_vc2(
  3      'SELECT SQL_TEXT FROM DBA_HIST_SQLTEXT WHERE DBID = 2461204241 AND SQL_ID = ''grtrhkkshy2wh'''
  4    )
  5  );

LENGTH(COLUMN_VALUE)
--------------------
                2000
                2000
                2000
                2000
                  
                2000
                2000
                2000
                 498

57 rows selected.

SQL>
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?