[ ZendFramework1 ] 1レコードずつメモリ消費を抑えて取得する (Zend_Db_Statement)

Pocket

ここでは、Zend_Db_Statement_Interface::fetch メソッドを使用して、1レコードずつ取得するサンプルコードを掲載しています。なお、oracle アダプタを使用している場合には OCI8 の oci_fetch_array 関数が内部でコールされています。

スポンサーリンク


レコード数が多いとメモリ消費量も多くなる

Zend_Db_Adapter_Abstract には、fetchAll や、fetchAssoc メソッドなどのクエリ結果を取得するメソッドが用意されていますが、これらのメソッドは、すべてのレコードをメモリ上に格納します。そのため、取得レコード数が多い場合には多くのメモリを消費してしまいますので、最悪エラーとなることも考えられます。

なお、当然エラーは、すべてのメソッドで、いついかなる時も発生する可能性はあります。可能性を言い出すとキリがないですが。。

1レコードずつ取得するサンプル

前置きが長くなりましたが、Zend_Db_Statement_Interface::fetch メソッドのサンプルコードは次の通りです。詳細はサンプル内のコメントを参照ください。

// データベースアダプタ
// Zend_Db_Adapter_Abstract $adapter 

// データベースへ接続する
$adapter->getConnection();

// クエリの作成
$sql = "select COL1, COL2, COL3 from TABLE1 where COL1 = 'xxx'";

// クエリの実行
// リターン値 : Zend_Db_Statement
$stmt = $adapter->query($sql);

/*
 * 細かい制御が必要な場合には、query メソッドではなく、以下のように分割してコールする
 */
//$stmt = $adapter->prepare($sql);
//$stmt->execute();

/*
 * クエリ結果を1レコードずつ取得する
 */
while($row = $stmt->fetch()) {

    $col1 = $row['COL1'];
    $col2 = $row['COL2'];
    $col3 = $row['COL3'];

    /*
     * 何か必要な処理を行う
     */
}

// データベース切断
$adapter->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>