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」テーブルに画像ファイルを格納するコンソールプログラム。
- プログラムの引数は、製品番号と画像ファイル名。
- 格納されたデータが、指定したファイルのデータと同じである事を確認する事。