ここでは、Zend Framework で、Oracle データベースに接続、トランザクション、クエリなどを行う基本的なサンプルコードを掲載しています。具体的には、Zend_Db(Zend_Db_Adapter_Oracle)クラスを使用します。
スポンサーリンク
基本的なOracle接続のサンプルコード
Oracle への接続からトランザクションの管理、クエリの作成を行うサンプルコードになります。詳細はサンプル内のコメントを参照ください。
// 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);
// フェッチモード(デフォルト値)の設定
$dbAdpt->setFetchMode(Zend_Db::FETCH_ASSOC);
try
{
// データベースへ接続
$dbAdpt->getConnection();
// トランザクションを開始(必要に応じて)
$dbAdpt->beginTransaction();
// Oracle アダプタでは、名前でのバインドのみサポートされている
var_dump($dbAdpt->supportsParameters('named')); // true
var_dump($dbAdpt->supportsParameters('positional')); // false
// select 文の発行
$sql = 'select * from table1 where col1 = :val1 and col2 = :val2';
// Zend_Db_Statement_Oracle ステートメントを取得
$stmt = $dbAdpt->query($sql, array(':val1' => 1, ':val2' => 'str'));
// select 文の発行(NGのケース)
//$sql = 'select * from table1 where col1 = ? and col2 = ?';
//$stmt = $dbAdpt->query($sql, array(1, 'str'));
// 一時的にフェッチモードを設定し、すべてのレコードを取得する場合
var_dump($stmt->fetchAll(Zend_Db::FETCH_ASSOC));
// レコード数を取得する
$row_count = $stmt->rowCount();
// 一時的にフェッチモードを設定し、最初のカラム(col1)のみすべて取得する場合
//var_dump($stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0));
// カーソルを閉じる
$stmt->closeCursor();
// insert 文の発行
$sql = 'insert into table1 values(:val1, :val2)';
$stmt = $dbAdpt->query($sql, array(':val1' => 10, ':val2' => 'insert'));
// カーソルを閉じる
$stmt->closeCursor();
// コミット(必要に応じて)
$dbAdpt->commit();
// データベースから切断
$dbAdpt->closeConnection();
} catch(Exception $e) {
// ロールバック(必要に応じて)
$dbAdpt->rollBack();
}
ポイント
- サンプルコード中にあるように、Zend_Db_Adapter_Oracle では、named バインドのみサポートしている
- fetchAll メソッドは、Zend_Db::FETCH_BOTH をサポートしていないので、Zend_Db::FETCH_BOTH を使用したい場合は、 fetch メソッドを使用する必要がある
Zend_Db_Adapter_Abstract::fetchAll メソッド
Zend_Db_Adapter_Abstract::fetchAll メソッドを使用することで、Zend_Db_Statement_Oracle ステートメントを受け取らず、結果のみの取得することもできます。
※ fetchAll メソッド内部で Zend_Db_Statement_Oracle::fetchAll を呼び出しています
// DB アダプタを取得 $dbAdpt = Zend_Db::factory($config->database); // データベースへ接続 $dbAdpt->getConnection(); $sql = 'select ・・・・'; var_dump($dbAdpt->fetchAll($sql)); // データベースから切断 $dbAdpt->closeConnection();
なお、この方法では自前でカーソルを閉じることができません。また、Zend_Db_Statement_Oracle の操作もできないので、用途に応じて使い分ける必要があります。
順序バインドは未サポート
前述のとおり Zend_Db_Adapter_Oracle では、順序バインドはできません。ただ、query メソッドではなくquoteInto メソッドを使用して順序バインドしている気分になることはできます。
$sql = 'select * from table1 where col1 = ? and col2 = ?'; $sql = $dbAdpt->quoteInto($sql, 1, Zend_Db::INT_TYPE, 1); // 最初の ? をバインド $sql = $dbAdpt->quoteInto($sql, 'str', null, 1); // 2番目の ? をバインド // クエリの発行 $stmt = $dbAdpt->query($sql); ・・・