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#コードが問題になるような(奇妙な)ものになると報告しています。
詳細をお知らせします。
引用(読み取り ここ )-
CASTを使用してCLOB値を文字データ型に、またはBLOB値をRAWデータ型に変換すると、データベースはLOB値を暗黙的に文字データまたは生データに変換し、結果の値を明示的にターゲットデータ型にキャストします。
だから、このような何かが動作するはずです-
_report := CAST(report_clob AS VARCHAR2);
_
または、BLOB
をVARCHAR
として使用しようとする場合は、CAST(report_clob AS VARCHAR2)
として使用することをお勧めします
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)」に設定されます。テキストの横に...
がありますが、内容は表示されません。
C#?
ここでの本当の問題はC#にあるのではないかと疑っていますが、問題をデバッグするのにC#がどの程度十分かはわかりません。
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;
これは私の近似です:
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;