• ベストアンサー
  • すぐに回答を!

php×postgresでのストアド利用について

  • 質問No.6461752
  • 閲覧数1026
  • ありがとう数1
  • 回答数2

お礼率 65% (240/366)

postgresで作成済みの手続き(ストアド)をphpから呼び出し結果を取得したいです。


■スキーマ
CREATE SCHEMA test
AUTHORIZATION postgres;

■テーブル
CREATE TABLE test.tbl1
(
item1 char(1),
item2 int4
)
WITHOUT OIDS;

■ストアド
CREATE OR REPLACE FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) AS
$BODY$declare
begin
select current_date + in_para1 into ot_para1;
select tablename from pg_tables into ot_para2;
select * from test.tbl1 into ot_para3;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) OWNER TO postgres;


サンプル的に下準備をしました。
この後、php側でこのストアドを呼び出すコードを教えて下さい。

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 79% (381/480)

MDB2は、結局のところ、PHPの標準関数のラッパーです。
MDB2/Driver/pgsql.php
あたりを見てみてください。
普通に、pg_queryを叩いているかと思います。

なので、最終的にpg_queryに直でストアドプロシージャを叩いたときに正しく結果が返ってくるのかを確認していただくのが
最も早いかな、と思います。

それと、すみません、私はストアドプロシージャを使ったことがないので、よくわからないんですが、
http://pear.plus-server.net/package.database.mdb2.intro-function-module.html
こちらあたりのマニュアルを閲覧されたんだと思いますが、これで渡せなかった、ってことですよね?

これを元に、
MDB2/Driver/Function/pgsql.php
の内容を見てみたんですが、こんな感じになってました。
<?php
function &executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}

$query = 'SELECT * FROM '.$name;
$query .= $params ? '('.implode(', ', $params).')' : '()';
return $db->query($query, $types, $result_class, $result_wrap_class);
}
?>

最終的に$queryが、構築完了したSQLなんですが、第二引数の$paramsは、ただ単純にimplodeで展開しただけみたいですね。
ストアドはわかりませんけど、見るからにダメそうな感じですね。

これは、MDB2::queryメソッドに、構築済みのSQLを渡したほうが早い気がしますね。(最初のpg_queryがストアドを通せるかを確認した後に。)

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 79% (381/480)

http://jp2.php.net/manual/ja/pdo.prepared-statements.php

PDOを使うと出来るっぽいですね。
例の10番目を観てみてください。
お礼コメント
ngwave

お礼率 65% (240/366)

ありがとうございます。

PDOですか、ストアド自体はそれでいけそうですね。
でも、ちょっと例題のハードルを高く設定しすぎました。
入力パラ1つと、入出力パラにスカラー、アレイ、テーブルと3種類用意してみましたが、ややこしすぎてうまくいっていません。
もう少しシンプルなところから試してみようと思います。

あと、
pear MSB2とかでは出来なさそうですか?
マニュアルサイトのFunction Moduleのところに一応例があったのですが、これも出力パラなしのシンプルな例しかなくて。。。
投稿日時:2011/01/21 10:39
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ