PostgreSQL存储过程执行时无法识别参数问题排查
问题分析与解决
你的存储过程存在两个核心问题:
- 语言类型不匹配:你将存储过程声明为
LANGUAGE 'sql',但内部使用了PL/pgSQL特有的DO $$ ... $$匿名块结构,这不符合SQL存储过程的语法规范。 - 作用域隔离:
DO匿名块是独立的执行单元,拥有自己的作用域,无法直接访问外部存储过程的参数_intid。PostgreSQL会把_intid误认为是表的列名,因此抛出"column _intid does not exist"的错误;而尝试用$1时,DO块内部未定义位置参数,所以又会报错"there is no parameter $1"。
修正后的存储过程代码
将存储过程的语言改为plpgsql,同时移除多余的DO $$ ... $$块,直接在存储过程体内编写PL/pgSQL逻辑,这样就能直接访问传入的参数:
CREATE OR REPLACE PROCEDURE public.test_proc( IN _intid integer DEFAULT 0) LANGUAGE plpgsql AS $BODY$ DECLARE dteStart date; BEGIN SELECT Startmonth FROM table1 WHERE id = _intid INTO dteStart; RAISE NOTICE 'dteStart: %', dteStart; END; $BODY$;
调用方式保持不变:
CALL test_proc(1);
内容的提问来源于stack exchange,提问作者LineBreak
相关产品推荐
相关产品推荐

