[ ZendFramework1 ] Oracle(clob, blob)カラムにファイルの格納と取得

Pocket

ここでは、Zend_Db_Adapter_Oracle および Zend_Db_Statement_Oracle を使用して clob 型 および blob 型のカラムにそれぞれテキストファイル、バイナリファイルを格納と取得を行うサンプルコードを掲載しています。

スポンサーリンク

clob, blob 型へファイルデータを格納するサンプルコード

ファイルをデータベースに格納するサンプルコードは次の通りです。詳細はサンプル内のコメントを参照ください。

// DB接続パラメータの設定
$config = new Zend_Config(
               array(
                  'database' => array(
                  'adapter' => 'oracle', // Zend_Db_Adapter_Oracle を使用する
                      'params'  => array(
                         'dbname'     => 'ds',
                         'username'   => 'user',
                         'password'   => 'password',
                         'persistent' => false,  // true : oci_pconnect(), false(default) : oci_connect()
                         'charset'    => 'UTF-8' // アプリケーションで使用している文字コード
                       )
                  )
               )
             );

// DB アダプタを取得
$dbAdpt = Zend_Db::factory($config->database);

// フェッチモードの設定(デフォルト値:Zend_Db::FETCH_ASSOC)
//$dbAdpt->setFetchMode(Zend_Db::FETCH_ASSOC);

// データベースへ接続
$conn = $dbAdpt->getConnection();

/* [トランザクションの開始]
 * トランザクションの開始を明示しないと自動コミットされるので注意
 */
$dbAdpt->beginTransaction();

// select 文の発行
$sql = "insert into table1(COL1, COL_CLOB, COL_BLOB) "
     . "            values(:col1, empty_clob(), empty_blob()) "
     . "            returning COL_CLOB, COL_BLOB into :cdata, :bdata";

$clob = oci_new_descriptor($conn, OCI_D_LOB); // clob ディスクリプタ
$blob = oci_new_descriptor($conn, OCI_D_LOB); // blob ディスクリプタ

$stmt = $dbAdpt->prepare($sql);

// バインド
$col1 = 100;
$stmt->bindParam(':col1',  $col1);
$stmt->bindParam(':cdata', $clob, OCI_B_CLOB, -1); // clob ディスクリプタ
$stmt->bindParam(':bdata', $blob, OCI_B_BLOB, -1); // blob ディスクリプタ

// クエリの実行
$stmt->execute();

// clob へファイルを格納
$importpath = "/path/to/text/file";
$clob->savefile($importpath);

// blob へファイルを格納
$importpath = "path/to/binnary/file";
$blob->savefile($importpath);

// コミット
$dbAdpt->commit();

// ディスクリプタの開放
oci_free_descriptor($blob);
oci_free_descriptor($clob);

// データベースから切断
$dbAdpt->closeConnection();

ポイント

  • beginTransaction メソッドをコールしないと自動コミットモードとして扱われる
  • ライブラリを用しているメリットが感じられない残念な気がする。もっとよい方法がある?

clob, blob 型からファイルデータを取得するサンプルコード

次はデータベースに格納されたファイルデータを取得するサンプルコードになります。

// DB アダプタを取得
$dbAdpt = Zend_Db::factory($config->database);

// データベースへ接続
$conn = $dbAdpt->getConnection();

$sql = 'select COL_CLOB, COL_BLOB from table1 where COL1 = 100';
$stmt = $dbAdpt->query($sql);

/*
 * OCI-Lob オブジェクトではなく、データそのものを取得する場合は
 * setLobAsString メソッドを true パラメータで呼び出す
 */
//$stmt->setLobAsString(true);
        
// 最初のレコードを取得
$row = $stmt->fetch();

$blob_data = $row['COL_BLOB'];
$clob_data = $row['COL_CLOB'];

/*
 * OCI-Lob オブジェクトで取得した場合は、以下のように操作する
 */
// データサイズを取得
//echo 'clob size : ' . $clob_data->size();
//echo 'blob size : ' . $blob_data->size();

// データの取得
//$clob_data->read($clob_data->size());
//$blob_data->read($blob_data->size());

// データベースから切断
$dbAdpt->closeConnection();

参考

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>