2017-08-17 18 views
0

パラメータ私はオラクルから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パラメータの値とこれらの値によってのみ指定されます。 OUTパラメータの構文はPostgreSQLとOracleの間で似ていますが、実装は最大限に異なります。

Oracleは、OUTパラメータのリファレンスを使用しています - ので、あなたのような何かを書くことができます。

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

この関数はブール値を返し、「サイド」効果として、それは参照によって渡された二番目のパラメータを変更します。

PostgreSQLではパラメータを参照渡しには対応していません。すべてのパラメータは値だけで渡されます。 OUTパラメータを使用すると、参照は渡されませんが、戻り値は結果コンポジットから取得されます。結果コンポジットはOUTパラメータからのみ構成されます。他の人のためのスペースはありません。だから、コード:foo機能の本当の結果が宣言ブール値と矛盾しているものをスカラーint型の値であるため

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

は、無効です。 RETURN trueも間違っています。結果はOUTパラメータのみに基づいているため、RETURNは式がなくてはなりません。

オラクルからのPostgresの関数fooの等価変換は次のとおりです。

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 

簡単ルール - ない返された値の仕様について - 関数はPostgresの中の変数をOUT有している場合には、その後、RETURN文は実行のみを終了するために使用されます。この値はOUTパラメータに基づいています。

関連する問題