[PHP]DB2のdb2_fetch_rowで行データを取得!基本から実践まで

PHP

こんにちは!今回は、DB2データベースのdb2_fetch_row関数について詳しく解説します。この関数は、クエリ結果から1行ずつデータを数値インデックスの配列として取得できます。

db2_fetch_rowとは?🎯

DB2のクエリ結果から1行分のデータを数値インデックスの配列として取得する関数です。シンプルで高速なデータ取得が特徴です。

基本的な使い方

$row = db2_fetch_row($statement);

基本的な使用例

例1:シンプルなデータ取得

$sql = "SELECT emp_id, name, department FROM employees";
$stmt = db2_exec($connection, $sql);

while ($row = db2_fetch_row($stmt)) {
    echo "社員ID: " . $row[0] . "\n";
    echo "名前: " . $row[1] . "\n";
    echo "部署: " . $row[2] . "\n";
    echo "---------------\n";
}

例2:テーブル表示

function displayEmployeeTable($connection) {
    $sql = "SELECT * FROM employees";
    $stmt = db2_exec($connection, $sql);

    echo "<table border='1'>";
    while ($row = db2_fetch_row($stmt)) {
        echo "<tr>";
        foreach ($row as $value) {
            echo "<td>" . htmlspecialchars($value) . "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}

実践的な使用例

例1:CSVエクスポート機能

function exportToCSV($connection, $filename) {
    $sql = "SELECT * FROM employees ORDER BY emp_id";
    $stmt = db2_exec($connection, $sql);

    $fp = fopen($filename, 'w');

    while ($row = db2_fetch_row($stmt)) {
        fputcsv($fp, $row);
    }

    fclose($fp);
}

例2:データ集計処理

function calculateDepartmentStats($connection) {
    $sql = "SELECT department, salary FROM employees";
    $stmt = db2_exec($connection, $sql);

    $stats = [];
    while ($row = db2_fetch_row($stmt)) {
        $dept = $row[0];
        $salary = $row[1];

        if (!isset($stats[$dept])) {
            $stats[$dept] = [
                'count' => 0,
                'total' => 0,
                'max' => 0,
                'min' => PHP_FLOAT_MAX
            ];
        }

        $stats[$dept]['count']++;
        $stats[$dept]['total'] += $salary;
        $stats[$dept]['max'] = max($stats[$dept]['max'], $salary);
        $stats[$dept]['min'] = min($stats[$dept]['min'], $salary);
    }

    return $stats;
}

例3:バッチ処理

function processBatchData($connection, $batchSize = 1000) {
    $sql = "SELECT * FROM large_table";
    $stmt = db2_exec($connection, $sql);

    $batch = [];
    $count = 0;

    while ($row = db2_fetch_row($stmt)) {
        $batch[] = $row;
        $count++;

        if ($count >= $batchSize) {
            processBatch($batch);
            $batch = [];
            $count = 0;
        }
    }

    // 残りのデータを処理
    if (!empty($batch)) {
        processBatch($batch);
    }
}

エラーハンドリング

function safeDataFetch($connection, $sql) {
    try {
        $stmt = db2_exec($connection, $sql);
        if (!$stmt) {
            throw new Exception("クエリ実行エラー");
        }

        $results = [];
        while ($row = db2_fetch_row($stmt)) {
            if ($row === false) {
                throw new Exception("データ取得エラー");
            }
            $results[] = $row;
        }

        return $results;

    } catch (Exception $e) {
        error_log("Error: " . $e->getMessage());
        return false;
    }
}

パフォーマンス最適化 🚀

1. メモリ効率の良い処理

function processLargeDataset($connection) {
    $stmt = db2_exec($connection, "SELECT * FROM large_table");

    while ($row = db2_fetch_row($stmt)) {
        processRow($row);
        unset($row);  // メモリ解放
    }
}

2. 必要なカラムのみ選択

// 良い例
$sql = "SELECT id, name FROM employees";

// 悪い例
$sql = "SELECT * FROM employees";

3. インデックスの活用

function getEmployeesByDepartment($connection, $department) {
    $sql = "SELECT * FROM employees WHERE department = ? ";
    $stmt = db2_prepare($connection, $sql);
    db2_bind_param($stmt, 1, $department, DB2_PARAM_IN);
    db2_execute($stmt);

    $employees = [];
    while ($row = db2_fetch_row($stmt)) {
        $employees[] = $row;
    }

    return $employees;
}

実装のTips 💡

1. カラム位置の定数定義

class EmployeeColumns {
    const ID = 0;
    const NAME = 1;
    const DEPARTMENT = 2;
    const SALARY = 3;
}

while ($row = db2_fetch_row($stmt)) {
    echo $row[EmployeeColumns::NAME];
}

2. データ検証

function validateRow($row) {
    return (
        isset($row[0]) &&
        is_numeric($row[0]) &&
        !empty($row[1]) &&
        is_numeric($row[3])
    );
}

3. データ変換

function transformRow($row) {
    return [
        'id' => (int)$row[0],
        'name' => trim($row[1]),
        'department' => $row[2],
        'salary' => number_format($row[3])
    ];
}

まとめ

  • db2_fetch_rowは数値インデックスでデータにアクセス
  • シンプルで高速なデータ取得が可能
  • 大規模データ処理時はメモリ管理に注意
  • カラム位置の管理が重要

これでdb2_fetch_rowの使い方をマスターできましたね!
効率的なデータ処理を実現していきましょう。

Happy Coding! 😊

タイトルとURLをコピーしました