web-dev-qa-db-ja.com

DB2は大きなCLOB(> 32KB)をテキストにキャストしましたか?

次のように定義されているDB2(9.5.1)テーブルがあります。

CREATE TABLE MY_TABLE 
( 
   ID INTEGER DEFAULT 0 NOT NULL, 
   TEXT CLOB(104857600), 
   PRIMARY KEY (ID) 
);

ここで、CLOBに格納されている実際のテキスト文字列をクエリする場合は、次のようにします。

select cast(t.TEXT as varchar(32000))
  from MY_TABLE t
  where t.ID = 1;

問題は、テキストが切り捨てられることですが、varcharの場合、最大長は32KBであるため、このクエリは失敗します。

select cast(t.TEXT as varchar(33000))
  from MY_TABLE t
 where t.ID = 1;

CLOBの全内容をテキスト出力として取得する方法は他にありますか?

ピーター

6
Peter Meier

私はこれをウェブ上の他の場所で見つけ、32kの制限を回避するので見て共有したいと思いました。

SELECT 
  XMLCAST (
    XMLPARSE (
      DOCUMENT CAST (
        MY_CLOB_DATA AS BLOB
      ) 
      PRESERVE WHITESPACE
    ) as XML
  ) 
FROM 
MY_TABLE
WHERE ID = 1
8
semiintel

同様の状況で、xmlデータを取得する必要がありましたが、これは私にとってはうまくいきました

select my_id, cast(xmlserialize(my_column as clob(1m)) as varchar(20000)) from schema.my_table where my_id  =  463

以前はCASTなしでsquirrelsqlでこれを行うことができましたが、最新バージョンではキャストを使用する必要がありました

2
Kalpesh Soni

私の知る限り、32kの制限を回避する方法はありません。これをSQLで使用すると、説明したように選択されます。

結果セットでgetString()を使用する代わりに、JDBCを使用してデータを取得すると、CLOBハンドルが取得され、そこからストリームを取得できます。

一方で、それは本当に限界なのか? where句などで本当にCLOBを使用していますか? RDBMSは、トランザクションで効率的に処理されるように、より小さな行サイズに最適化されています。

一般的に、データをストリーミングします。このCLOBに複数の列に分割できるデータが含まれていて、クエリでそのデータの一部が必要な場合(...、order by ...など)、データモデルの再設計を検討してください。

1
Beryllium