能否在PL/pgSQL函数内部修改IN参数及函数头定义的参数?
嘿,这是个很实用的问题,我来给你拆解清楚PL/pgSQL里关于参数修改的这些细节:
关于PL/pgSQL函数参数修改的问题解答
1. 能否在PL/pgSQL函数内部修改IN类型的参数?
答案是可以,但修改仅在函数内部生效。PL/pgSQL里的IN参数本质是传入值的副本,你完全可以在函数体内给这个参数变量重新赋值,比如:
CREATE OR REPLACE FUNCTION test_in_param(a IN integer) RETURNS integer AS $$ BEGIN a := a + 1; -- 这里修改IN参数是完全允许的 RETURN a; END; $$ LANGUAGE plpgsql;
调用这个函数SELECT test_in_param(5);会返回6,但外部传入的原始变量(如果有的话)不会被改变——因为你修改的只是函数内部的副本,和外部变量没有关联。
2. 能否在函数内部将函数头中定义的参数修改为其他值?
这个问题得拆成两种情况看:
- 如果是IN类型参数:如上面所说,你可以在函数内部修改它的值,但这个修改只局限在函数内部,不会传递回调用者。
- 如果是INOUT/OUT类型参数:这类参数的修改会被传递回调用者,因为它们本身就设计用来承载输出值。但如果你的函数头里定义的是纯IN参数,那没法让外部感知到你在内部做的修改。
你之前看的教程说"无法实现",大概率是指无法通过IN参数将修改后的值传递回外部——这个说法是准确的,因为IN参数的设计就是单向传入,不会向外输出修改结果。如果需要让外部获取修改后的值,你得改用INOUT参数,或者把修改后的值作为函数返回值。
比如用INOUT的例子:
CREATE OR REPLACE FUNCTION test_inout_param(a INOUT integer) RETURNS integer AS $$ BEGIN a := a + 1; -- 修改INOUT参数,这个值会被返回给调用者 END; $$ LANGUAGE plpgsql;
调用SELECT test_inout_param(5);会返回6,而且如果是在PL/pgSQL块里调用,传入的变量也会被更新:
DO $$ DECLARE num integer := 5; BEGIN SELECT test_inout_param(num) INTO num; RAISE NOTICE 'Updated num: %', num; -- 会输出Updated num: 6 END $$;
内容的提问来源于stack exchange,提问作者Daniel L. VanDenBosch
相关产品推荐
相关产品推荐

