PL/pgSQL的DO $$...$$块中能否用DECLARE?报错求助
PL/pgSQL DO块报错原因及解决方法
你的问题出在两个核心规则差异上:
PL/pgSQL的DO块不允许直接裸写SELECT返回结果
DO块是匿名过程,和你熟悉的T-SQL匿名块规则不同,它无法直接返回结果集。你写的select x;会被当成独立的SQL语句执行,而SQL上下文无法识别PL/pgSQL中DECLARE声明的变量x,数据库误以为你要查询名为x的数据类型,因此抛出“type 'x' does not exist”的错误。PL/pgSQL中处理变量和SELECT的正确方式
若只是验证变量值,需要用RAISE NOTICE输出;若要获取SELECT结果,得用INTO赋值给变量;若需要返回结果集,应该用函数而非DO块。
修正后的测试代码(输出变量值)
DO $$ DECLARE x int = 123; BEGIN RAISE NOTICE '变量x的值为: %', x; END $$;
处理SELECT结果的示例(赋值给变量)
DO $$ DECLARE x int = 123; y int; BEGIN SELECT x INTO y; RAISE NOTICE '变量y的值为: %', y; END $$;
如果需要返回结果集,改用函数
CREATE OR REPLACE FUNCTION get_test_value() RETURNS int AS $$ DECLARE x int = 123; BEGIN RETURN x; END $$ LANGUAGE plpgsql; -- 调用函数获取结果 SELECT get_test_value();
内容的提问来源于stack exchange,提问作者Victor Sotnikov
相关产品推荐
相关产品推荐

