7

マルチバイト文字は私に多くの苦痛をもたらしました。

この問題に対する提案はありますか?

マルチバイト文字を含む可能性のある CLOB フィールドがあり、SQL で選択し、このフィールドをダウンストリーム プロセス用の文字列に変換する必要があります。現在、次を使用しています。

SELECT DBMS_LOB.SUBSTR( description, 4000, 1 ) FROM table

ただし、上記のコマンドの 4000 は、バイトではなく文字の長さです。そのため、データに忍び込んだ可能性のあるマルチバイト文字を処理するために 3000 に変更する必要がありました。そうしないと、バッファー サイズ エラーが発生します。

問題は、マルチバイト文字を含まないレコードの場合です。必要以上のデータが不必要に切り捨てられる可能性があります。(4000 は文字列の制限です。私たちはそれを受け入れることができます/しなければなりませんでした。)

以下と同等のことを行う方法はありますか:

SELECT DBMS_LOB.SUBSTR( description, 4000bytes, 1 ) FROM table

そうすれば、可能な限り多くのデータを取得できます。

注:一時テーブル/ビューを作成することは許可されておらず、PL/SQL を使用せず、SQL SELECT のみを使用しています...

4

2 に答える 2

8

Jeffrey の思考プロセスは問題ありませんが、alchn も正しいです。この同じ問題に遭遇したばかりで、これが私の解決策です。ただし、関数を作成できる必要があります。

Create Or Replace Function clob_substr(p_clob   In Clob
                                      ,p_offset In Pls_Integer
                                      ,p_length In Pls_Integer) Return Varchar2 Is
Begin
  Return substrb(dbms_lob.substr(p_clob
                                ,p_length
                                ,p_offset)
                ,1
                ,p_length);
End;
/

これがその使用のデモです:

Select c
      ,clob_substr(c
                  ,1
                  ,4000)
  From (

        Select xmlelement("t", rpad('é', 4000, 'é'), rpad('é', 4000, 'é')).extract('//text()').getclobval() c
          From dual

        );
于 2012-10-08T08:50:20.903 に答える
5

結果の varchar2 を SUBSTR で切り捨ててください:

SELECT SUBSTRB( DBMS_LOB.SUBSTR( description, 4000, 1 ), 1, 4000) FROM table
于 2012-08-23T06:06:52.583 に答える