2017-12-18 3 views
-2

PL/SQLを使用すると、同じ関数内からストアド・ファンクションをコールすることができます。これは、次の例で示すことができます。PL/SQLプロシージャは再帰的にコールできますか?

CREATE OR REPLACE FUNCTION factorial(x in number) 
RETURN number 
IS 
    f number; 
BEGIN 
    IF x = 0 THEN 
     f := 1; 
    ELSE 
     f := x * factorial(x-1); 
    END IF; 
RETURN f; 
END; 
/

DECLARE 
    num number; 
    factorial number; 
BEGIN 
    num := # 
    factorial := factorial(num); 
    dbms_output.put_line(' The factorial of '|| num || ' is ' || factorial); 
END; 
/

これもPL/SQLストアドプロシージャを使用して行うことができますか?

+4

なぜもちょうど見つけるためにそれを試してみてください? –

答えて

2

はい、あなたは、PL/SQLで自分自身を再帰的に呼び出すプロシージャを記述することができます。ここでは階乗を実装する例を示します。

これで、エラー処理なしで手続き(またはあなたのような関数)を書くことは決してしないでください。理由を理解できない場合は、下の匿名ブロックで55.3に変更すると、その理由が表示されます。

コードウィンドウ:

create or replace procedure fact (x in number, x_fact out number) 
as 
begin 
    if x = 0 then x_fact := 1; 
    else   fact(x-1, x_fact); 
       x_fact := x * x_fact; 
    end if; 
end; 
/

set serveroutput on 

declare 
    z number; 
begin 
    fact(5, z); 
    dbms_output.put_line(z); 
end; 
/

スクリプト出力ウィンドウ(コードの対応する部分にそれぞれ「結果」をマッチングは、練習として左):

Procedure FACT compiled 

PL/SQL procedure successfully completed. 

120 
2

PL/SQL関数を再帰的に呼び出すことができます(すべての言語でそうする危険性に関するすべての通常の警告とともに!)。

しかし、ローカル変数の名前を関数と同じにすると、問題が発生します。あなたがブロックを実行しようとすると、例えば、このエラーメッセージが表示されます:

PLS-00222: no function with name 'FACTORIAL' exists in this scope 
+2

ここに示した内容は間違いありません。それは問題ではありませんでした。 – mathguy

関連する問題