17

clob 変数があり、それを varchar2 変数に割り当てる必要があります。clob var 内のデータが 4000 未満 (つまり、varchar2 の最大サイズ) 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 

同じ結果が得られます。

編集

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

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

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

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

したがって、私の調査によると、report := transform (report_clob) はレポートを long 値またはそのようなもの (奇妙なもの) にするため、5000 varchar 出力パラメーターでより大きな値を処理するために C# コードが問題になります。

詳細については、喜んで提供させていただきます。

4

4 に答える 4

15

引用 (ここを読む)-

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

だから、このようなものはうまくいくはずです-

report := CAST(report_clob AS VARCHAR2(100));

または、 asCAST(report_clob AS VARCHAR2(100))を使用しようとしている場所で使用することをお勧めします。BLOBVARCHAR

于 2012-10-12T14:16:14.440 に答える
4

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 に変換しません。PL/SQL デバッガと 999 文字を超える文字列の制限により、そのように見えるだけです。

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

C#?

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

于 2014-03-08T00:19:27.653 に答える
3
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;
于 2015-11-03T13:54:55.900 に答える
0

これは私の概算です:

  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;
于 2012-11-01T18:59:45.817 に答える