php - plpgsql调用存储过程并获取结果集

时间:2013-07-03 14:11:15

标签: php postgresql stored-procedures

我正在尝试创建一个从user表返回行的存储过程。 我用pg_函数从php调用它: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端。

3 个答案:

答案 0 :(得分:1)

这是一个返回表的函数,所以你必须像对待表一样对待它:

SELECT * FROM user_read_all();

在psql中尝试两种方法并仔细查看输出。您的原始方式返回一组行类型,FROM方式返回列。

关于语法错误 - 你没有给它,所以我不能说。

尽管可以避免对列/表名使用保留字。 “类型”,“名称”,“用户”等等 - 请参阅文档了解详细信息。

答案 1 :(得分:1)

这里的真正问题是user除了current_user之外还是PostgreSQL中的保留关键字,与MySQL相反,只保留current_user

函数的第一种形式在创建时没有产生语法错误,因为plpgsql解析器没有尝试识别列。但它肯定会在运行时失败。如果php代码没有发出任何错误,那么可能缺少错误检测代码。

PG中的

user返回您的登录名,可以像使用表一样使用: SELECT * FROM user,或作为独立表达式:SELECT user,[other columns] FROM table...

如果您仍然希望将其用作表名,则必须将其括在双引号中:SELECT * FROM "user"(假设它已创建为小写。双引号的另一个效果是它打开了确切的大小写匹配)。

对于像您这样只运行查询的函数,您不希望使用过程plpgsql语言,而是使用更高效的sql语言。在SQL中,函数将是:

CREATE OR REPLACE FUNCTION user_read_all()
  RETURNS table(id INT, name VARCHAR, email VARCHAR)
AS
  $BODY$
    SELECT
      user_id as id, user_name as name, user_email as email
    FROM
      "user";
  $BODY$
LANGUAGE sql;

您可以使用SELECT user_read_all()来调用它,但SELECT * from user_read_all()可能是您希望得到3个正确的列。

答案 2 :(得分:-2)

   $get_test = "SELECT test()";
    $test = pg_query($db_server, $get_test);
    while ($row = pg_fetch_array($test)) {
         $value = $row[0];
    }

    echo $value;