2017-05-15 5 views
0

CLOBのすべてのデータをstringに変換したいと考えています。 DBMC_LOB.SUBSTRは、一度に4000文字をフェッチする方法を提供します。私はMS SQLのバックグラウンドであり、Oracleのクエリを認識していません。誰かが構文を教えてくれますか?私は、関数を作成し、以下文字列を取得するためのCLOBによるループ・ループ

// Get the length of CLOB 
// totalIterationsRequired = length/4000; 
// LOOP around the CLOB and fetch 4000 char at once 
For i in 1..totalIterationsRequired 
LOOP 
// Insert the substring into a varchar2 
// DBMC_LOB.SUBSTR(xml_value,4000*i,(4000*(i-1)+1) 
END LOOP 
// The function will return the varchar2 
+0

です。ありがとう。 – anonyXmous

+0

私は構文に関して助けが必要です。質問 – Ankit

答えて

2
create table save_table(rec varchar2(4000)); 

create or replace PROCEDURE save_clob (p_clob IN CLOB) 
AS 
    l_length    INTEGER; 
    l_start    INTEGER := 1; 
    l_recsize CONSTANT INTEGER := 4000; 
BEGIN 
    l_length := DBMS_LOB.getlength (p_clob); 

    WHILE l_start <= l_length 
    LOOP 
     INSERT INTO save_table (rec) 
      VALUES (DBMS_LOB.SUBSTR (p_clob, l_recsize, l_start)); 

     l_start := l_start + l_recsize; 
    END LOOP; 
END save_clob; 
+0

を更新しました。save_tableでエラーが発生すると思います。私たちはどこに戻ってきているclobを保存するために文字列を追加していますか? – Ankit

+1

このコードは機能し、既存のパッケージから抽出されました。この例では、結果を 'SAVE_TABLE'という表に保存しています。次に、テーブルから結果を選択します。それは関数ではありません。 PL/SQLファンクションは、SQLファンクション4000である32767文字のみを戻すことができます(デフォルトでは、データベースをより大きな値に構成できます)。 CLOBを使用する理由は、内容が文字列内に収まらないためです。 CLOBのサイズが大きすぎる場合、あなたは何をしますか? –

+0

あなたは正しいですが、これはコンパイルされません。私は構文に何か間違っていると思う – Ankit

0

ような何かをしたい

は、あなたの質問をしてください。関数定義

create or replace function getclobastable (id IN VARCHAR2) 
    return clob_table 
is 
    l_length    INTEGER; 
    l_start    INTEGER := 1; 
    l_recsize CONSTANT INTEGER := 4000; 
    i_clob     CLOB; 
    n BINARY_INTEGER := 0; 
    save_table clob_table := clob_table(); 
BEGIN 

    save_table := clob_table(); 
    -- Get the CLOB data into i_clob 
    l_length := DBMS_LOB.getlength (i_clob); 

    WHILE l_start <= l_length 
    LOOP 
     n := n + 1; 

     save_table.EXTEND(); 
     save_table(n) := DBMS_LOB.SUBSTR (i_clob, l_recsize, l_start); 

     l_start := l_start + l_recsize; 
    END LOOP; 
    RETURN save_table; 
END; 
関連する問題