You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用带INOUT参数的PostgreSQL存储过程?报错求助

问题分析与解决

核心问题

  1. 存储过程名称不匹配:你创建的存储过程是document_copy,但所有调用语句里用的都是document_template_copy_one,这直接导致PostgreSQL找不到对应的对象。
  2. 调用方式错误:PostgreSQL中调用存储过程必须使用CALL命令,而非SELECT(SELECT用于调用函数,存储过程和函数是不同的数据库对象)。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:23