[Codeigniter-users] ストアドプロシージャのOUT値取得について

Back to archive index

戸田 広 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




Codeigniter-users メーリングリストの案内
Back to archive index