2016-08-23 14 views
0

を返さないPL/SQL再帰関数は値

OracleのPL/SQL再帰関数を実行する機能が

誰もが問題になる可能性があります知っている値なしで返されながら、私は、エラーメッセージが表示されましたか?

ここに私の機能は、あなたが戻って、変数への再帰関数の値を代入

イベントで
FUNCTION cgic (cnt IN NUMBER) 
    RETURN VARCHAR2 
    IS 
     n_inv_code VARCHAR2 (20); 
     t_ic_chk       NUMBER; 
    BEGIN 
        SELECT DBMS_RANDOM.STRING ('X', 10) 
     INTO n_inv_code 
     FROM DUAL; 

        select count(*) into t_ic_chk from inv_code where inv_code = n_inv_code and rownum = 1; 

     IF t_ic_chk = 1 
     THEN 
        n_inv_code := cgic(cnt); 
     ELSE 
        IF t_ic_chk = 0 
           THEN 
         RETURN n_inv_code; 
           END IF; 
     END IF; 
    END cgic; 
+0

't_ic_chk <> 1'のときにはどうなりますか? rownum = 1の –

+0

は、常に0または1であってはなりませんか? – elsiehsu

+0

完全なORAコードのエラーは何ですか?コンパイル時または実行時に取得しましたか? – Ditto

答えて

3

t_ic_chk = 1

だ:しかし、あなたはそれで何もしないn_inv_code

を。 おそらくそれを返すことになります。

私はあなたの最後のセクションでは、このコードをお勧めします:あなたが行を見つけた場合、)

1あなたがものを見つけることができないまでバックで再帰、および:

IF t_ic_chk = 1 
    THEN 
       n_inv_code := cgic(cnt); 
    END IF; 
    RETURN n_inv_code; 
END cgic; 

あなたが必要とするすべてですその値を返します。 2)行が見つからない場合は、その値を戻します。 3)行を見つけた場合は、返された値を手で振って、誰でもあなたに電話してください。

+0

ああはい。私はここでリターン部分を忘れて、再帰呼び出しがそれを返すと期待しています.... Thxたくさん!おかげさまで – elsiehsu

0

IF t_ic_chk = 1で始まるコードは、関数が期待値を返します。いずれか、または、それが見つかった値をどうするかを知っていない場合は例外が発生します。この方法で完了

CASE t_ic_chk 
    WHEN 0 THEN RETURN n_inv_code; 
    WHEN 1 THEN RETURN cgic(cnt); 
    ELSE RAISE_APPLICATION_ERROR(-20202, 'Unexpected t_ic_chk value=' || t_ic_chk); 
END; 

に置き換えることがありますt_ic_chkで

cntパラメータは、再帰呼び出しで渡す以外は、プロシージャでは使用されていないため、なぜ渡すのか不思議です。

幸運のベスト。

+0

私は実際にSP内のループ内でこの関数を呼び出していて、例外があるときに終了したくありません。 – elsiehsu