如何在PGAdmin中调用返回VOID的PostgreSQL函数?
在PGAdmin中调用PostgreSQL void返回值函数的正确方法
嘿,我来帮你解决这个调用函数的问题~ 你定义的这个返回void的PL/pgSQL函数,之前用EXEC、SELECT、PERFORM报错,主要是因为这些方式的适用场景不一样,下面给你拆解正确的调用方法和原因:
先搞懂之前报错的原因
PERFORM Foo(100);:这是PL/pgSQL专属的语法,只能在PL/pgSQL块(比如其他函数、存储过程、DO块)内部使用,直接在PGAdmin的查询窗口里执行纯SQL时,PostgreSQL会不识别这个语法,自然报错。EXEC/EXECUTE:同样是PL/pgSQL的执行动态SQL的语法,不能作为独立的SQL语句直接运行,必须包裹在PL/pgSQL块里。SELECT Foo(100);:理论上这个是合法的SQL调用方式,但如果报错,大概率是权限问题(比如你没有该函数的执行权限,或者对SomeTable没有删除权限)、SomeTable不存在,或者参数类型不匹配,而非调用方式本身的问题。
PGAdmin里的正确调用方式
方式1:直接用SELECT调用
返回void的函数可以用SELECT直接调用,执行后会返回一行空的结果集,这是标准的SQL调用方式:
SELECT Foo(100);
执行后PGAdmin会显示类似“1 row(s) returned”的提示,同时结果集是空的,这就说明函数已经执行成功了。
方式2:用DO块包裹PERFORM执行
如果不想看到空的结果集,可以用DO块创建一个临时的PL/pgSQL上下文,在里面用PERFORM调用函数:
DO $$ BEGIN PERFORM Foo(100); END $$;
执行后PGAdmin会提示“DO”,表示执行成功,不会返回任何结果集,适合只需要执行操作不需要返回结果的场景。
方式3:改成存储过程用CALL调用(推荐PostgreSQL 11+)
如果你的PostgreSQL版本是11及以上,更推荐把函数改成存储过程(PROCEDURE),因为存储过程专门用于执行无返回值的操作,调用方式更直观:
首先修改你的定义为存储过程:
CREATE OR REPLACE PROCEDURE Foo(someid_param integer) AS $$ BEGIN DELETE FROM SomeTable WHERE id = someid_param; END; $$ LANGUAGE plpgsql;
然后用CALL语句调用:
CALL Foo(100);
这种方式和其他数据库的存储过程调用逻辑一致,更符合常规操作习惯。
内容的提问来源于stack exchange,提问作者JohnB
相关产品推荐
相关产品推荐

