ここでは、OCI8 関数を使用して CLOB 型と BLOB 型のフィールドに対してファイルを格納と取得を行うサンプルコードを掲載しています。CLOB 型がテキストファイルを、BLOB 型のフィールドがバイナリデータファイルを扱う違いはありますが、データの格納と取得を行う方法に相違はありません。
スポンサーリンク
CLOB 型 BLOB 型にファイルの挿入と読み込みサンプル
clob 型のフィールドに対してファイルの挿入および取得を行うサンプルコードです。本サンプルでは、データベースから取得したファイルデータをダウンロードしています。
// データベースへ接続する
$conn = oci_connect('user', 'password', 'localhost/XE');
$sql = "insert into table(COL1, COL_CLOB) "
." values(:col1, empty_clob()) "
." returning COL_CLOB into :data";
$stmt = oci_parse($conn, $sql);
$clob = oci_new_descriptor($conn, OCI_D_LOB);
$col1 = "key1";
oci_bind_by_name($stmt, ":col1", $col1);
// BLOB 型の場合は OCI_B_BLOB
oci_bind_by_name($stmt, ":data", $clob, -1, OCI_B_CLOB);
// sql の実行
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
// clob への書き込み処理は、SQLの発行後に行う必要がある
$importpath = "/usr/local/・・・/import.xml"
$clob->savefile($importpath);
// savefile は import のエイリアスなので、import 関数を用いても良い
//$clob->import($importpath);
oci_commit($conn);
// 以下のいずれかでディスクリプターを開放する
//$clob->free();
oci_free_descriptor($clob);
/*
* clob カラムからデータを取得し、ファイルとしてダウンロードする
*/
$sql = 'select * from table where COL1 = :col1';
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':col1', $col1);
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
// 先頭のレコードのみ取得
$row = oci_fetch_array($stmt, OCI_ASSOC);
// clob データを取得
$clob_data = $row['COL_CLOB'];
// リソース開放処理
oci_free_statement($stmt);
oci_close($conn);
// ファイルのダウンロード
header('Content-Disposition: attachment; filename="download.xml"');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $clob_data->size());
echo $clob_data->load();
サイズの小さいファイルの場合
clob 型の場合は、varchar2 型のフィールドに文字列を挿入するように insert できます。小さなファイルであれば 一旦すべてファイルの内容をメモリに読み込んでも良いかと思います。
/ ファイルの内容を取得
$data = file_get_contents('/path/to/text/file');
// データベースへ接続する
$conn = oci_connect('user', 'password', 'ds');
// col1 varchar2, col2 clob
$sql = "insert into table1 values('key1', $data) ";
$stmt = oci_parse($conn, $sql);
// sql の実行
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
// コミット
oci_commit($conn);