sql >> データベース >  >> RDS >> Mysql

Laravelのmysqlストアドプロシージャから複数の結果セットをフェッチする方法

    私は次のコードを使用していますが、問題なく動作します。ニーズに合わせて変更してください。

    public static function CallRaw($procName, $parameters = null, $isExecute = false)
    {
        $syntax = '';
        for ($i = 0; $i < count($parameters); $i++) {
            $syntax .= (!empty($syntax) ? ',' : '') . '?';
        }
        $syntax = 'CALL ' . $procName . '(' . $syntax . ');';
    
        $pdo = DB::connection()->getPdo();
        $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
        $stmt = $pdo->prepare($syntax,[\PDO::ATTR_CURSOR=>\PDO::CURSOR_SCROLL]);
        for ($i = 0; $i < count($parameters); $i++) {
            $stmt->bindValue((1 + $i), $parameters[$i]);
        }
        $exec = $stmt->execute();
        if (!$exec) return $pdo->errorInfo();
        if ($isExecute) return $exec;
    
        $results = [];
        do {
            try {
                $results[] = $stmt->fetchAll(\PDO::FETCH_OBJ);
            } catch (\Exception $ex) {
    
            }
        } while ($stmt->nextRowset());
    
    
        if (1 === count($results)) return $results[0];
        return $results;
    }
    

    呼び出し例:

    $params = ['2014-01-01','2014-12-31',100];
    $results = APIDB::CallRaw('spGetData',$params);
    

    結果の呼び出しは次のようになります:

    CALL spGetData(?,?,?)
    

    結果セットが1つしかない場合は、そのまま返されます。さらにある場合は、結果セットの配列を返します。キーは$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);を使用しています。 。それがないと、恐ろしいSQLSTATE[HY000]: General error: 2053 例外がスローされます。

    try {} catch()ブロックは、フェッチできない結果セットを削除するために使用されます。特に、2つの結果セットを返すプロシージャがあります。1つは更新(または他のexecuteステートメント)の結果であり、最後の1つは実際のデータです。 fetchAll()でスローされた例外 実行クエリを使用すると、PDOExceptionになります 。

    警告:関数は最適化されていません。パラメータを1回通過するだけで書き換えることができます。



    1. MySQLは、groupbyの後に最初のnull以外の値を取得します

    2. SQLite-データの更新

    3. SQLiteデータ型

    4. フィールドへの外部キーのリファクタリング