2017-12-18 18 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

도 그냥 찾아 그것을 시도 이유 :

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; / 

스크립트 출력 창 (코드의 해당 부분에 각각 "결과를"일치는 연습으로 왼쪽) ? –

답변

2

예, PL/SQL에 자신을 재귀 적으로 호출하는 프로 시저를 작성 할 수 있습니다. 다음은 계승을 구현하는 예입니다.

그렇다면 오류 처리없이 프로 시저 (또는 사용자와 같은 함수)를 작성하지 마십시오. 이유를 모르겠 으면 아래의 익명 블록에서 55.3으로 변경하면 이유가 표시됩니다.

코드 창

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