web-dev-qa-db-ja.com

Oracle pl / sql内でCLOBをVARCHAR2に変換する方法

Clob変数があり、それをvarchar2変数に割り当てる必要があります。 clob var内のデータは4000(つまり、varchar2のmaxsize)未満ですOracle10 +

私は試した

  report_len  := length(report_clob);
  report      := TO_CHAR(dbms_lob.substr(report_clob, report_len, 1 ));
  report_clob := null;

しかし、デバッグ中に表示される長い値にレポートを変換します。また、C#コードからこのsql(proc)を呼び出すとき。 varcharごとにパラメーターを送信するため、バッファーが小さすぎると文句を言いますが、上記の変換はそれを長い値に変換する可能性があります。

私も直接割り当てを試しました

   report_clob := report 

同じ結果が得られます。

[〜#〜] edit [〜#〜]

OK、以下の質問に答えるには、PL/SQL開発者のテストスクリプトを使用してデバッグしてください。レポート変数はvarchar2(4000)です。 2行目以降にステップしたとき。レポートは長い値であることが示され、(Long Value)とだけ表示されます。内容を見ることすらできません。

reportおよびreport_clobは、プロシージャからの変数です。このプロシージャは、C#コードから呼び出されます。

このプロシージャを呼び出すと、C#の例外文字列バッファが小さすぎます。プロシージャから最大4000文字の値を受け取るのに十分なC#のレポート変数のサイズとして5000を指定しました。だから私は問題がそこにあるとは思わない。

そして、report:= 'some string ....'を割り当てると、C#呼び出しは正常に機能します。

だから私の調査では、report:= transform(report_clob)によってレポートが長い値になるか、5000 varchar outパラメーターの大きな値を処理するC#コードが問題になるような(奇妙な)ものになると報告しています。

詳細をお知らせします。

9
Munish Goyal

引用(読み取り ここ )-

CASTを使用してCLOB値を文字データ型に、またはBLOB値をRAWデータ型に変換すると、データベースはLOB値を暗黙的に文字データまたは生データに変換し、結果の値を明示的にターゲットデータ型にキャストします。

だから、このような何かが動作するはずです-

_report := CAST(report_clob AS VARCHAR2);
_

または、BLOBVARCHARとして使用しようとする場合は、CAST(report_clob AS VARCHAR2)として使用することをお勧めします

7
Annjawn

VARCHAR2からCLOBへの変換

PL/SQLでは、単純な割り当て、SUBSTRおよび他のメソッドを使用してCLOBをVARCHAR2に変換できます。単純な割り当ては、CLOBがVARCHAR2のサイズ以下の場合にのみ機能します。制限は、PL/SQLでは32767、SQLでは4000です(ただし、12cではSQLで32767が許可されます)。

たとえば、このコードは単純な割り当てによって小さなCLOBを変換してから、大きなCLOBの先頭を変換します。

declare
    v_small_clob clob := lpad('0', 1000, '0');
    v_large_clob clob := lpad('0', 32767, '0') || lpad('0', 32767, '0');
    v_varchar2   varchar2(32767);
begin
    v_varchar2 := v_small_clob;
    v_varchar2 := substr(v_large_clob, 1, 32767);
end;

LONG?

上記のコードは、値をLONGに変換しません。 PL/SQLデバッガーと999文字を超える文字列の制限のため、そのように見えます。

たとえば、PL/SQL Developerでテストウィンドウを開き、上記のコードを追加してデバッグします。 v_varchar2を右クリックし、[変数をウォッチに追加]を選択します。コードをステップ実行すると、値は「(Long Value)」に設定されます。テキストの横に...がありますが、内容は表示されません。 PLSQL Developer Long Value

C#?

ここでの本当の問題はC#にあるのではないかと疑っていますが、問題をデバッグするのにC#がどの程度十分かはわかりません。

2
Jon Heller
ALTER TABLE TABLE_NAME ADD (COLUMN_NAME_NEW varchar2(4000 char));
update TABLE_NAME set COLUMN_NAME_NEW = COLUMN_NAME;

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
ALTER TABLE TABLE_NAME rename column COLUMN_NAME_NEW to COLUMN_NAME;
1
panser

これは私の近似です:

  Declare 
  Variableclob Clob;
  Temp_Save Varchar2(32767); //whether it is greater than 4000

  Begin
  Select reportClob Into Temp_Save From Reporte Where Id=...;
  Variableclob:=To_Clob(Temp_Save);
  Dbms_Output.Put_Line(Variableclob);


  End;
0
Esneyder