我把数据库从Oracle迁移到了pgsql,得到了如下代码:
CREATE OR REPLACE FUNCTION PKG_UTIL_BD_LOGISTICS_getsignerinfo (
i_opCode T_MQ_LOGIC_TRACK_HEAD_LOG.LP_CODE%TYPE, i_remark T_MQ_LOGIC_TRACK_HEAD_LOG.REMARK%TYPE, i_acceptTime T_MQ_LOGIC_TRACK_HEAD_LOG.SIGNED_TIME%TYPE, i_signer T_MQ_LOGIC_TRACK_HEAD_LOG.SIGNER%TYPE, i_lpcode T_MQ_LOGIC_TRACK_HEAD_LOG.LP_CODE%TYPE,
o_signer OUT T_MQ_LOGIC_TRACK_HEAD_LOG.SIGNER%TYPE, o_signerTime OUT T_MQ_LOGIC_TRACK_HEAD_LOG.SIGNED_TIME%TYPE, o_status OUT T_MQ_LOGIC_TRACK_HEAD_LOG.STATUS%TYPE )
RETURNS RECORD AS $body$
DECLARE
v_signer T_MQ_LOGIC_TRACK_HEAD_LOG.SIGNER%TYPE;
v_signerTime T_MQ_LOGIC_TRACK_HEAD_LOG.SIGNED_TIME%TYPE;
v_status T_MQ_LOGIC_TRACK_HEAD_LOG.STATUS%TYPE;
BEGIN
IF i_lpcode = 'SF' THEN
IF i_opCode = '8000' THEN
IF POSITION(':back' in i_remark) > 0 THEN
v_status := '3';
ELSE
v_status := '7';
v_signerTime := i_acceptTime;
v_signer := SUBSTR(i_remark, POSITION(':' in i_remark) + 1);
END IF;
ELSIF i_opCode = '9999' THEN
v_status := '3';
ELSIF i_opCode = '80' THEN
v_status := '7';
v_signerTime := i_acceptTime;
ELSIF i_opCode = 70 THEN
v_status := i_opCode;
ELSE
v_status := '1';
END IF;
ELSE
IF i_opCode = 'signed' THEN
v_signerTime := i_acceptTime;
v_signer := i_signer;
v_status:='7';
ELSE
v_status:='1';
END IF;
END IF;
o_status := v_status;
o_signer := v_signer;
o_signerTime := v_signerTime;
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION '%', 'PKG_UTIL_BD_LOGISTICS.getSignerInfo fetch parameters' || i_remark || 'value error:' || SQLERRM;
END;
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
字符串
当我执行代码时,我得到了下面的错误:
错误:RETURN不能在具有OUT参数的函数中具有参数
有人能帮忙吗?我是pgsql的新手。
3条答案
按热度按时间rjzwgtxy1#
带有OUT参数的函数的结果由OUT参数的值指定,并且仅由这些值指定。尽管PostgreSQL和Oracle之间OUT参数的语法相似,但实现方式却有很大的不同。
Oracle使用引用作为OUT参数-所以你可以这样写:
字符串
这个函数返回布尔值,作为“副作用”,它修改了通过引用传递的第二个参数。
PostgreSQL不支持通过引用传递参数。所有参数都只通过值传递。当您使用OUT参数时,则没有传递引用,但返回值取自结果组合。结果组合仅由OUT参数组成。没有空间用于任何其他参数。因此代码:
型
是无效的,因为
foo
函数的真实的结果是标量int值,这与声明的boolean相矛盾。RETURN true
也是错误的,因为结果只基于OUT参数,那么RETURN
应该没有任何表达式。从Oracle到Postgres的函数foo的等价翻译是:
型
简单的规则-当函数在Postgres中有OUT变量时,
RETURN
语句仅用于结束执行-而不是返回值规范。此值基于OUT参数。kzipqqlq2#
请考虑以下示例:
字符串
注意开始和结束之间的“updatecode”。如果你试图执行这个,你会得到和你提到的一样的错误,因为当你在函数参数中有OUT时,你不能返回变量“return updateCode”。所以正确的def应该是如下:
型
gywdnpxw3#
下面是同样的错误:
错误:RETURN不能在具有OUT参数的函数中具有参数
因为当我在PL/pgSQL function中使用
OUT
参数时,我返回了2
和RETURN 2;
,如下所示:字符串
所以,我没有返回任何有或没有
RETURN;
,如下所示,然后错误得到解决:型
或者:
型