Teradataでは、java.sql.Clobとjava.sql.Blobがシリアライズ可能なクラスとして実装されています。このため、テーブル関数から利用でき、テーブル関数の反復実行間でオブジェクトを受け渡すことができます。
ただし、テーブルUDFがClobまたはBlobオブジェクトを使用して中間記憶域のデータを保持するときには、テーブルUDFを書く際に特別な考慮事項があります。
item_clobオブジェクトを使用して反復実行間でデータを保持するテーブルUDFについて考えてみましょう。
class item_clob implements Serializable
{
int id;
java.sql.Clob myclob;
...
}
Tbl.allocCtx()がテーブル関数の反復実行で使用するオブジェクトのすべてのデータを保持するのに十分な中間記憶域を割り当てられるようにするには、メンバーのmyclobがNULLの場合、テーブルUDFでwriteObject()メソッドを実装して、ダミーのバイト アレイをシリアライズされたバイナリ ストリームに書き出すという方法があります。
ダミーのバイト アレイのサイズは64です。このサイズは、完全にシリアライズされたTeradataのjava.sql.Clobとjava.sql.Blobオブジェクトのサイズです。
class item_clob implements Serializable
{
int id;
java.sql.Clob myclob;
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
{
byte[] dummy = new byte[64];
out.defaultWriteObject();
/* Allocate storage for lob by writing the dummy bytes */
/* into its serialized binary stream if myclob is null. */
if (myclob == null)
out.write(dummy);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException
{
in.defaultReadObject();
}
}
完全な例については、例: Clobを使用して中間記憶域のデータを保持するテーブルUDFを参照してください。