次のように定義されている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の全内容をテキスト出力として取得する方法は他にありますか?
ピーター
私はこれをウェブ上の他の場所で見つけ、32kの制限を回避するので見て共有したいと思いました。
SELECT
XMLCAST (
XMLPARSE (
DOCUMENT CAST (
MY_CLOB_DATA AS BLOB
)
PRESERVE WHITESPACE
) as XML
)
FROM
MY_TABLE
WHERE ID = 1
同様の状況で、xmlデータを取得する必要がありましたが、これは私にとってはうまくいきました
select my_id, cast(xmlserialize(my_column as clob(1m)) as varchar(20000)) from schema.my_table where my_id = 463
以前はCASTなしでsquirrelsqlでこれを行うことができましたが、最新バージョンではキャストを使用する必要がありました
私の知る限り、32kの制限を回避する方法はありません。これをSQLで使用すると、説明したように選択されます。
結果セットでgetString()を使用する代わりに、JDBCを使用してデータを取得すると、CLOBハンドルが取得され、そこからストリームを取得できます。
一方で、それは本当に限界なのか? where句などで本当にCLOBを使用していますか? RDBMSは、トランザクションで効率的に処理されるように、より小さな行サイズに最適化されています。
一般的に、データをストリーミングします。このCLOBに複数の列に分割できるデータが含まれていて、クエリでそのデータの一部が必要な場合(...、order by ...など)、データモデルの再設計を検討してください。