如何在psql中调用带有INOUT参数的PostgreSQL存储过程
psql调用该存储过程的实现方案
完全可以在psql中实现和Oracle sql-plus完全等价的需求,不存在功能缺失问题
方法1:使用PL/pgSQL匿名块调用(和Oracle写法逻辑一致)
该写法和你熟悉的Oracle sql-plus匿名块逻辑几乎一致,仅语法细节有差异,执行以下SQL即可,psql默认会打印输出内容:
DO $$ DECLARE a_err varchar(200); a_id int; BEGIN -- 调用存储过程需要用CALL关键字 CALL dt_test.integer_insert(a_id, 13, 'A prime example', a_err); -- 等价于Oracle的dbms_output.put_line,%为占位符自动拼接变量 RAISE NOTICE 'The new ID is: %', a_id; END $$;
方法2:直接使用CALL命令调用(更简便)
如果不需要额外的逻辑处理,可直接调用存储过程,INOUT参数传入NULL即可,执行后会直接返回结果集展示a_id和a_err的取值:
CALL dt_test.integer_insert(NULL, 13, 'A prime example', NULL);
注意事项
- 该写法仅支持PostgreSQL 11及以上版本,因为
PROCEDURE对象是PostgreSQL 11版本首次引入的功能,更早版本需要将存储过程改写为函数实现,逻辑完全一致。 - 调用前需确保当前用户拥有
dt_test模式的访问权限,以及对应存储过程的执行权限,权限不足时可使用管理员账号执行赋权:GRANT EXECUTE ON PROCEDURE dt_test.integer_insert(int, integer, varchar, varchar) TO 你的用户名;
内容的提问来源于stack exchange,提问作者gsiems
相关产品推荐
相关产品推荐

