0

ユーザー テーブルから行を返すストアド プロシージャを作成しようとしています。私は pg_ functions:pg_prepare($conn, $id, 'SELECT user_read_all()')pg_execute($conn, $id, array()). 悲しいことに、私は mysql のためだけに PDO を持っていません。

このコードで試しましたが、複数の問題があります。

CREATE OR REPLACE FUNCTION user_read_all()
  RETURNS table(user_id INT, user_name VARCHAR, user_email VARCHAR)
AS
  $BODY$
  BEGIN
    return query SELECT
      user_id, user_name, user_email
    FROM
      user;
  END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

pg_fetch により、結果はarray('test' => string(...))代わりにarray(user_id => 1, user_name => '', user_email => ''). user_プレフィックスも切り取りたいのですが、これで構文エラーが発生しました:

CREATE OR REPLACE FUNCTION user_read_all()
  RETURNS table(id INT, name VARCHAR, email VARCHAR)
AS
  $BODY$
  BEGIN
    return query SELECT
      user_id as id, user_name as name, user_email as email
    FROM
      user;
  END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

;-(

plpgsqlでこれを行うことは可能ですか?

私の目標は、ストアド プロシージャのみのインターフェイスを作成することですが、深刻な疑問があります... mysql を使用すると、これは非常に簡単ですが、mysql は pgsql と比較して機能が制限されています...

CREATE PROCEDURE `user_read_all`()
BEGIN
    SELECT `user_id` AS `id`, `user_name` AS `name`, `user_email` AS `email` FROM `user`
    ORDER BY `user_id` DESC;
END;

問題は、ストアド プロシージャと php の結果セットを修正する方法です。

解決

CREATE FUNCTION test ()
  RETURNS TABLE (id INT, name VARCHAR, email VARCHAR)
AS
  $BODY$
  BEGIN
    return QUERY SELECT
      "user".user_id, "user".user_name, "user".user_email
    FROM
      "user";
  END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

SELECT * FROM test();

php側。

4

2 に答える 2

1

これはテーブルを返す関数なので、テーブルのように扱う必要があります。

SELECT * FROM user_read_all();

psql で両方を試して、出力を注意深く見てください。元の方法は行型のセットを返し、FROM の方法は列を返します。

構文エラーについては、あなたが教えてくれないのでなんとも言えません。

ただし、列/テーブル名に予約語を使用しないでください。「タイプ」、「名前」、「ユーザー」など - 詳細はドキュメントを参照してください。

于 2013-07-03T14:49:00.177 に答える