2017-08-17 1 views
0

ich von Oracle die DB-Migration auf pgsql hätte, hätte den Code wie folgt:RETURN kann keinen Parameter in der Funktion mit OUT hat Parameter

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 

, wenn ich den Code ausgeführt wird, ich die Fehlermeldung anzeigt: RETURN nicht haben kann ein Parameter in Funktion mit OUT-Parametern. Kann jemand helfen? Ich bin zu pgsql neu.

Antwort

2

Das Ergebnis der Funktion mit OUT-Parametern wird durch Werte von OUT-Parametern und nur durch diese Werte angegeben. Obwohl die Syntax der OUT-Parameter zwischen PostgreSQL und Oracle ähnlich ist, ist eine Implementierung maximal unterschiedlich.

verwendet Oracle Referenz für OUT Parameter - so können Sie so etwas wie schreiben:

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

Diese Funktion gibt Booleschen Wert und als „Nebeneffekt“ modifiziert sie zweiten Parameter als Referenz übergeben.

PostgreSQL unterstützt das Übergeben von Parametern nicht als Referenz. Alle Parameter werden nur als Wert übergeben. Wenn Sie den OUT-Parameter verwenden, wird keine Referenz übergeben, aber die zurückgegebenen Werte werden aus der Ergebniszusammensetzung übernommen. Result Composite besteht nur aus OUT-Parametern. Es gibt keinen Platz für irgendeinen anderen. So Code:

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

ist ungültig, weil reale Ergebnis foo Funktion skalare int-Wert ist, was mit erklärt boolean in Widerspruch. RETURN true ist auch falsch, weil das Ergebnis nur auf OUT-Parametern basiert und dann RETURN ohne jeden Ausdruck sein sollte.

Equivalent Übersetzung der Funktion foo von Oracle auf Postgres ist:

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 

Einfache Regel - wenn Funktion OUT Variablen in Postgres hat, dann RETURN Anweisung nur Ausführung verwendet wird, für das Ende - nicht für zurückgegebene Wert Spezifikation. Dieser Wert basiert auf OUT-Parametern.

Verwandte Themen