我目前在存储过程方面遇到了麻烦。
我有这个存储过程,在架构 main 下:
register(LOGIN_ID varchar, PASSWORD varchar)
我试图在查询中调用它但我没有运气,
$query = "SELECT main.register('test','pass123')";
$run = $pg_query($conn, $query);
这将返回 没有函数与给定名称和参数类型匹配的错误。您可能需要添加显式类型转换。
任何见解请。感谢。
答案 0 :(得分:2)
尝试显式演员:
$query = "SELECT main.register('test'::varchar,'pass123'::varchar)";
使用此查询诊断您的问题并报告输出。
在数据库中的所有模式中查找函数:
SELECT n.nspname, p.proname, pg_catalog.pg_get_function_arguments(p.oid) as params
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname ~~* '%my_function_name_here%'
AND pg_catalog.pg_function_is_visible(p.oid);
使用相同角色进行连接! 演示输出:
nspname | proname | params
---------+----------+----------------------------------------
public | register | string text
public | register | login_id varchar, password varchar
main | register | string text, form text, maxlen integer
这是Dee的输出:
nspname | proname | params
---------+----------+----------------------------------------
(0 rows)
显然,您的角色无法在任何架构中看到名称register
的任何参数和任何参数。在大多数情况下,请尝试与超级用户postgres
相同的操作。
如果您将其视为超级用户,则您要连接的角色缺少必要的权限,很可能是在架构main
上。在这种情况下,固化将是(作为模式main
的超级用户或所有者):
GRANT USAGE ON SCHEMA main TO my_role;