2017-11-08 12 views
1

私は現在、CLOBである単一の列(COMMENTS)を持っています。 COMMENTS CLOB列をoracle SQLの別々の(4k)VARCHAR2列に分割する方法はありますか?CLOBを複数のVARCHAR2行に変換する方法は?

create or replace procedure longsubstr(p_rowid in rowid, 
             comment in comment) 
          return varchar2 
          as l_tmp long; 
          begin 
          select COMMENT into l_tmp from table_name 
                where rowid = p_rowid; 
          return substr(l_tmp, p_form, p_for); 
          end; 
          /
+0

、あなたができることを確認。 varchar2列名をクエリに挿入する必要があるため、動的です。そうでない場合は、CTE –

+0

で行うことができるクエリの値を取得するだけであれば、記述する必要があるコードの例を表示できますか? – icerabbit

+0

残念ながら私はここでは、Oracle環境を持っていないし、私はそれに少し錆びています。他の人が回答を追加できるかどうかを見てみましょう。あなたがどんな試みを提供しても良いでしょう。 –

答えて

2

SQLFIDDLE:ここでは、事前

おかげで以下の私の試みです

SELECT DBMS_LOB.SUBSTR(t.comments, 4000, l.COLUMN_VALUE) 
FROM table_name t 
     CROSS JOIN 
     TABLE(
     CAST(
      MULTISET(
      SELECT LEVEL * 4000 - 3999 
      FROM DUAL 
      CONNECT BY LEVEL * 4000 - 3999 <= DBMS_LOB.GETLENGTH(t.comments) 
      ) AS SYS.ODCINUMBERLIST 
     ) 
     ) l 

または

WITH positions (comments, pos) AS (
    SELECT comments, 
     1 
    FROM table_name 
UNION ALL 
    SELECT comments, 
     pos + 4000 
    FROM positions 
    WHERE pos + 4000 <= DBMS_LOB.GETLENGTH(comments) 
) 
SELECT DBMS_LOB.SUBSTR(comments, 4000, pos) AS split_comment 
FROM positions 
+0

ありがとうございました。あなたは最初の解決策であなたがしたことを私に説明することができますか?そうでない場合は、私はあなたの答えを最良の答えとしてマークしますが、どんな助けも大いに評価されます。デカルト関数で列の値として使用する値 '1'を最終的に得てデカルト結合を実行することに決めた理由を完全に理解できません。代わりに '1'を使うことはできませんか?その価値を得るためにデカルト結合に何のメリットがありますか? – icerabbit

+0

@icerabbitこれは、階層的なクエリによって生成された 'VARRAY'を生成し、' CLOB'の長さまでの値 '1,4001,8001、...'を与え、それらのそれぞれのVARRAYは、適切な行を追加して元のテーブルに戻し、その位置から始まる4000文字の部分文字列を取得するために使用しました。 – MT0

1

あなたは

0を使用することができます

dbms_lob.substr(clob_column, for_how_many_bytes, from_which_byte) このため

機能:動的なコードでPLSQLを通じて

declare 
    type typ_comment is table of varchar2(4000); 
    v_varchar typ_comment := typ_comment(); 
    v_clob table_name.comments%type; 
    k   number; 
    j   number := 4000; 
begin 
    select comments into v_clob from table_name where rowid = '&p_rowid'; -- like AAAS9BAAEAAAAEeAAA without quotation 
    k := ceil(dbms_lob.getlength(v_clob)/j); 
    v_varchar.extend(k); 
    for i in 1..k 
    loop 
    v_varchar(i):= dbms_lob.substr(v_clob, j, 1 + j * (i - 1)); 
    end loop; 
end; 
関連する問題