戸田 広
info****@sciss*****
2012年 12月 1日 (土) 12:48:27 JST
こんにちは、戸田です。 CodeIgniter でのクエリーは 最終的には PHP ネイティブの関数に渡されます。 ご例示されたような、複数のクエリーをセミコロンで区切って 一度に実行するやり方が実行できるか できないかは、 対象となる PHP の関数が そのやり方に対応しているか していないか に 依存します。 例えば、 mysql ドライバーの場合は mysql_query() が実行されていますが、 これは複数のクエリーを一度に実行することはできません。 私は、処理はすべてモデルクラス内に泥臭く書いていますので、 ストアドプロシージャを利用するうえで効率的な方法がないか 今回 はじめて確認してみましたが、 ご例示のような、実行文を2回実行する以上に洗練されたやり方は 残念ながら見つけることができませんでした。 CI_Model を継承した MY_Model クラスを作り ( /application/core ディレクトリ内に置きます)、 その中で ご希望の処理を実装したメソッドを作れば 各モデルクラスでの記述は減らすことができそうです。 簡単に書くと、次のような感じかと思います。 function call_stored_procedure($stored_procedure_name, $output_variable_name) { $this->db->query('call ' . $stored_procedure_name . '(' . $output_variable_name . ')'); $query = $this->db->query('select ' . $output_variable_name); return $query->result(); } 以上です。 On 2012/11/30, at 23:35, taka koba wrote: > はじめてメールさせていただきます。kobaと申します。 > Codeigniterの扱いにはまだ不慣れな者です。 > 表題の件、もしお分かりになる方がおりましたらご教授ください。よろしくお願いしますm(_ _)m > > MySQLでストアドプロシージャーを作り、ストアドプロシージャー実行時の引数に出力値を格納するような処理を考えています。 > > $this->db->query("call cal_total(@num)"); > $query = $this->db->query("select @num"); > > ここで cal_total(OUT num INT) はレコードのトータル数を求めて、変数numにその数を格納するようなストアドプロシージャー > だとします。とりあえず、上記のようなコードを書くと、$queryには@numカラムに値が入った結果が帰ってくるので、 > 希望通りの処理ができるのですが書き方としてもう少しスマートな方法はないものかと思い、質問させていただきました( > たとえば、$this->db->query("call cal_total(@num); select @num"); のように1行で記述できるような方法等)。 > > マニュアルを見てみたのですが、希望の処理が見つかりませんでした。出力を得たいストアドプロシージャーをCodeigniter > で書きたい場合は、このように実行文を2回書くような方法になるのでしょうか。 > > よろしくお願いいたしますm( _ _ )m > _______________________________________________ > Codeigniter-users mailing list > Codei****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users