2017-08-17 70 views
0

我从Oracle到pgsql的数据库迁移和有像下面的代码:RETURN不能有一个参数与OUT功能参数

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的新手。

回答

2

具有OUT参数的函数的结果由OUT参数的值指定,并且仅由这些值指定。尽管PostgreSQL和Oracle的OUT参数语法类似,但实现方式却有很大的不同。

Oracle使用OUT参数参考 - 所以你可以写这样的:

CREATE FUNCTION foo(a int, OUT b int) 
RETURN boolean IS 
BEGIN 
    b := a; 
    RETURN true; 
END; 

此函数返回布尔值,是“面”的效果它会修改通过引用传递第二个参数。

PostgreSQL不支持按引用传递参数。所有参数仅按值传递。当您使用OUT参数时,则不会传递引用,但返回的值将从结果合成中获取。结果组合仅由OUT参数组成。没有其他任何空间。所以代码:

CREATE OR REPLACE FUNCTION foo(a INT, OUT b int) 
RETURNS boolean AS $$ 
BEGIN 
    b := a; 
    RETURN true; 
END; $$ LANGUAGE plpgsql 

是无效的,因为foo功能的真正的结果是标int值,是什么在声明布尔矛盾。 RETURN true也是错误的,因为结果仅基于OUT参数,因此RETURN应该没有任何表达式。函数foo从甲骨文到Postgres的

等效翻译是:

CREATE OR REPLACE FUNCTION foo(a INT, OUT b int, OUT result boolean) 
RETURNS record AS $$ 
BEGIN 
    b := a; 
    result := true; 
    RETURN; 
END; $$ LANGUAGE plpgsql 

简单的规则 - 当函数具有OUT Postgres里的变量,那么RETURN声明仅用于执行结束 - 而不是返回值规范。该值基于OUT参数。