如何调用带INOUT参数的PostgreSQL存储过程?报错求助
问题分析与解决
核心问题
- 存储过程名称不匹配:你创建的存储过程是
document_copy,但所有调用语句里用的都是document_template_copy_one,这直接导致PostgreSQL找不到对应的对象。 - 调用方式错误:PostgreSQL中调用存储过程必须使用
CALL命令,而非SELECT(SELECT用于调用函数,存储过程和函数是不同的数据库对象)。 - INOUT参数传递不当:INOUT参数需要在调用时传入变量,不能直接省略或用错误的赋值方式。
正确的调用示例
假设你的document_copy存储过程完整逻辑如下(补全常见的复制逻辑示例):
CREATE OR REPLACE PROCEDURE document_copy( IN p_name character varying, IN p_id smallint, INOUT p_new_id smallint ) LANGUAGE plpgsql AS $$ BEGIN -- 示例逻辑:复制document表中p_id对应的记录,使用新的p_name,返回新记录的ID INSERT INTO document(name) -- 替换为实际表字段 SELECT p_name FROM document WHERE id = p_id RETURNING id INTO p_new_id; END; $$;
方式1:使用DO块调用
DO $$ DECLARE test SMALLINT; BEGIN CALL document_copy('Mexico Passport'::varchar, 1::smallint, test); -- 可在此打印或使用返回的新ID RAISE NOTICE '新生成的记录ID: %', test; END $$;
方式2:在psql会话中直接调用
-- 声明会话变量 \set new_id 0 -- 调用存储过程(若存储过程在dust模式下,需加上模式前缀dust.document_copy) CALL document_copy('Test'::varchar, 1::smallint, :new_id); -- 查看返回结果 SELECT :new_id;
额外注意事项
- 确认存储过程所属模式:如果存储过程创建在
dust模式下,调用时必须加上模式名,即CALL dust.document_copy(...)。 - 严格匹配参数类型:确保传入的参数类型和存储过程定义的
character varying、smallint完全一致,避免隐式转换导致的匹配失败。
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

