4. ラージオブジェクト
4.1. BLOBの書き込み
ラージオブジェクトは通常のデータ型では扱えないような、大きなデータを格納するための型です。画像などのバイナリデータを格納する「BLOB(binary large object)」と、テキストを格納する「CLOB(character large object)」の2種類がSQL99で規定されています。これについては、PostgreSQLを含め既に多くのデータベースでサポートされています。PostgreSQLでは以下のようにして、ラージオブジェクトを使用するテーブルを定義します。
create table product_photo(p_num int references product(p_num) primary key,
p_photo bytea);
プログラムでBLOBオブジェクトをデータベースに格納するには次のようにします。「PreparedStatement」の「setBinaryStream」メソッドを使用します。
connection.setAutoCommit(false);
String sql="insert into product_photo values(?,?)";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,104);
File file=new File("/tmp/myphoto.jpg");
FileInputStream input=new FileInputStream(file);
statement.setBinaryStream(2,input,(int)file.length());
statement.executeUpdate();
connection.commit();
9行目で「setBinaryStream」メソッドを呼び出しています。これまでの「set???」メソッドと異なり、3つ目の引数に格納するバイナリデータのサイズを指定します。最後に「executeUpdate」メソッドを呼び出しデータを格納しますが、注意点として必ずAutoCommitモードをオフにしなければなりません(1行目)。これはPostgreSQLのJDBCドライバの制約です。
実はPostgreSQLには、BLOB, CLOBを取り扱う方法として、oidデータ型も提供されています。oid型はオブジェクトの識別子を管理するデータ型で、実際のデータは他に保存します。bytea型は1ギガまでのデータしか扱えないという制約もあるのですが、ほとんどの場合、それで十分ですのでこちらのデータ型を使用するようにして下さい。
(実習課題1)
以下のプログラムを作成しなさい。
- 「product_photo」テーブルに画像ファイルを格納するコンソールプログラム。
- プログラムの引数は、製品番号と画像ファイル名。
- 格納されたデータが、指定したファイルのデータと同じである事を確認する事。

