PostgreSQL:如何从PL/pgSQL代码块获取变量输出及解决报错
解决PostgreSQL DO块中无法输出变量值的问题
嘿,我来帮你搞定这个PostgreSQL的小问题!你遇到的错误其实很常见——DO块本身就不是用来返回查询结果的,它的定位是执行一些不需要返回数据的操作(比如修改数据、创建对象)。你在DO块里写select l_pin,l_pin1;,PostgreSQL不知道该把这个结果送到哪里,所以就抛出了那个"query has no destination for result data"的错误。
下面给你两种最实用的解决方案,根据你的需求选就行:
方案1:用RAISE NOTICE输出变量(适合调试)
这是最简单的调试方法,直接把SELECT换成RAISE NOTICE,让PostgreSQL把变量值打印到控制台:
DO $$ DECLARE l_pin INT; l_pin1 int; BEGIN l_pin := 3; l_pin1 := 4; -- 用RAISE NOTICE输出变量,%是占位符 RAISE NOTICE 'l_pin 的值是 %, l_pin1 的值是 %', l_pin, l_pin1; END; $$ LANGUAGE PLPGSQL;
执行后,你会在控制台看到类似这样的输出:
NOTICE: l_pin 的值是 3, l_pin1 的值是 4
方案2:创建函数返回结果集(适合需要获取结构化数据的场景)
如果你需要像普通查询一样得到返回的结果集,那最好别用DO块,而是写一个自定义函数:
-- 创建或替换函数 CREATE OR REPLACE FUNCTION get_pin_values() RETURNS TABLE(pin INT, pin1 INT) AS $$ DECLARE l_pin INT; l_pin1 int; BEGIN l_pin := 3; l_pin1 := 4; -- 返回查询结果 RETURN QUERY SELECT l_pin, l_pin1; END; $$ LANGUAGE PLPGSQL;
然后调用这个函数就能得到标准的查询结果了:
SELECT * FROM get_pin_values();
返回的结果会是:
| pin | pin1 |
|---|---|
| 3 | 4 |
顺便解释一下错误提示里的PERFORM:它是用来在PL/pgSQL里执行不需要返回结果的查询时用的(比如调用一个只做操作不返回值的函数),但你现在是要输出变量值,所以这个提示对你的场景不适用,不用管它~
内容的提问来源于stack exchange,提问作者Shahul
相关产品推荐
相关产品推荐

