我正在尝试创建一个从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端。
答案 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;