以前に投稿した、FuelPHPでストアドプロシージャを実行する方法について、解決したので改めて記事にまとめてみます。
詳しくは、先日の記事をご覧ください。
【未解決】FuelPHPでストアドプロシージャを実行してデータを取得したい
https://cpoint-lab.co.jp/【未解決】fuelphpでストアドプロシージャを実行して/
今回実行するストアドプロシージャはこちら。
年と月を指定して、この期間に該当するデータを取得します。
1> EXEC dbo.user_month_report @year =2017, @month =12; 2> go
こちらは、直接ターミナルで実行すると、データが取得できるので、プロシージャには問題なし。
そして、前回のコードは下記の通り。
// 修正前 $result = DB::query("EXEC dbo.user_month_report @year =2017, @month =12;"); $result->execute();
こちらを実行すると、結果で bool(true) が返ってきてしまい、理由がわからず頭を抱えていましたが、実行の方法が間違っていました。
修正後の正しいコードはこちら。
// 修正後 $tmp = DB::query("EXEC dbo.user_month_report @year =2017, @month =12;", DB::SELECT); $result = $tmp->execute()->as_array();
修正前のコードでは、execute() で実行したものをそのまま出力しようとしていたのですが、そうではなく、一旦変数に代入してから出力したところ、無事にデータが取得できているのを確認できました。
また、DB::query()の第二引数の$typeに SQL クエリタイプとして「DB::SELECT」を指定して、データを取得するプロシージャであることを明記しました。
これも必須の指定のようでした。
更に、取得できたデータに対して as_array() を使うと、データを配列に格納できて、扱いやすくなります。
execute() と as_array() はセットで覚えるのがおすすめですね。
以上、FuelPHPでストアドプロシージャを実行する方法でした。
ちょっとしたミスでしたが、私はこういう些細なミス程ハマりやすいので、今後もこまめに備忘録として投稿していきたいと思います。