2013-10-25 3 views
0

나는 다음과 같은 PL/SQL 기능이 있습니다PL/SQL 명령을 계속 실행

CREATE OR REPLACE FUNCTION GETOVERUREN(v_user_id IN NUMBER, v_jaar IN NUMBER) 
RETURN NUMBER 
AS 
    v_resultaat number := 0; 
    v_min_uren_id number := 0; 
    v_max_uren_id number := 0; 
BEGIN 
    SELECT MIN(UREN_ID) INTO v_min_uren_id FROM UREN WHERE JAAR_NR = v_jaar AND UREN_ID IN (SELECT UREN_ID FROM GEBRUIKER_UREN g WHERE g.USER_ID = v_user_id); 
    SELECT MAX(UREN_ID) INTO v_max_uren_id FROM UREN WHERE JAAR_NR = v_jaar AND UREN_ID IN (SELECT UREN_ID FROM GEBRUIKER_UREN g WHERE g.USER_ID = v_user_id); 

    DECLARE 
     v_subtotaal number := 0; 
    BEGIN 
    v_max_uren_id := v_max_uren_id +1; 
    WHILE v_min_uren_id < v_max_uren_id LOOP 
     SELECT SUM(OMAANDAG+ODINSDAG +OWOENSDAG +ODONDERDAG +OVRIJDAG +OZATERDAG +OZONDAG) INTO v_subtotaal FROM UREN WHERE UREN_ID = v_min_uren_id; 

        ---------------------------------------------- 
        FIXED: v_min_uren_id := v_min_uren_id +1;(FORGOT TO + THE LOOP ITSELF) 
        ---------------------------------------------- 

        v_resultaat := v_resultaat + v_subtotaal; 
    END LOOP; 
RETURN v_resultaat; 
END; 
END; 

The following sql command should give the following outcome: 
SELECT GETOVERUREN(1,2013) FROM UREN; WHERE 1 is the userid and 2013 is the year 

GETOVERUREN(1,2013) 
------------------- 
      10.25 

But instead it gives: 

GETOVERUREN(1,2013) 
------------------- 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
      10.25 
Up to 157 times (wich is the total of rows i have in my table.) 

/* I는 함수 SQLDeveloper이 기능을 실행 중지 못해, 실행 및 유지 사용하십시오. 나는 반 시간 동안 아무런 결과도 기다리지 않았다. 내가 뭘 잘못 했니? */

달리기의 문제가 수정되었으므로 많은 결과를 얻었습니다.

create or replace FUNCTION TESTING(v_user_id IN NUMBER) 
RETURN NUMBER 
AS 
    v_resultaat number := 0; 
BEGIN 
    SELECT IS_ADMIN INTO v_resultaat FROM GEBRUIKER WHERE USER_ID = v_user_id; 
    return v_resultaat; 
END TESTING; 

이 함수는 값을 반환하지 않습니다,하지만이 값 X 그렇게 다시 GEBRUIKER에있는 행의 수를 반환 뭔가 잘못입니다 :

나 자신이처럼 보이는 예를 들어 함수를했습니다 하지만 나는 그것이 무엇인지 알아낼 수 없습니다.

+2

while 루프가 있고 조건이 잘못되지 않아 루프가 나오지 않습니다. 두 번째 기능에서 무엇을 시도하고 있습니까? 너는 무엇을 기대하고 있니? –

+0

두 번째 함수는 간단한 함수를 시도합니다. 이 함수는 출력하기 위해 고안되었습니다 : 0, 그러나 나는 4 번 0을 얻습니다. 첫 번째 함수에 관해서는 당신이 옳았습니다. 내가 할 수 있었던 가장 무서운 실수였습니다. 덕분에 당신이 주셔서 감사합니다 – user2919688

답변

3

변수 내에서 루프의 증가분을 이동 (최대에서 최소로 변경)해야합니다. 그렇지 않으면 무한 루프가 발생합니다. 이것을 시도하십시오 :

CREATE OR REPLACE FUNCTION GETOVERUREN(v_user_id IN NUMBER, v_jaar IN NUMBER) 
RETURN NUMBER 
AS 
    v_resultaat number := 0; 
    v_min_uren_id number := 0; 
    v_max_uren_id number := 0; 
BEGIN 
    SELECT MIN(UREN_ID) INTO v_min_uren_id FROM UREN WHERE JAAR_NR = v_jaar AND UREN_ID IN (SELECT UREN_ID FROM GEBRUIKER_UREN g WHERE g.USER_ID = v_user_id); 
    SELECT MAX(UREN_ID) INTO v_max_uren_id FROM UREN WHERE JAAR_NR = v_jaar AND UREN_ID IN (SELECT UREN_ID FROM GEBRUIKER_UREN g WHERE g.USER_ID = v_user_id); 

    DECLARE 
     v_subtotaal number := 0; 
    BEGIN 
    WHILE v_min_uren_id < v_max_uren_id LOOP 
     v_min_uren_id := v_min_uren_id +1; 
     SELECT SUM(OMAANDAG+ODINSDAG +OWOENSDAG +ODONDERDAG +OVRIJDAG +OZATERDAG +OZONDAG) INTO v_subtotaal FROM UREN WHERE UREN_ID = v_min_uren_id; 

     v_resultaat := v_resultaat + v_subtotaal; 
    END LOOP; 
RETURN v_resultaat; 
END; 
END; 
+0

awnser 주셔서 감사합니다, 그건 내 실수 였어, 내가 totaly 내 부분을 놓친 + + 내 루프 ....하지만 난 stil 많은 결과를 다시 (157) 단지 1 결과 대신에 도착 , v_resultaat. 왜 그런지 알기나 해? – user2919688

+0

@ user2919688 원래 질문을 편집하고 테이블의 샘플 데이터, 두 번째 함수를 실행하는 데 사용하는 코드 블록, 출력 결과 및 예상 출력을 추가하십시오. –

+0

@ user2919688의 경우 UREN 테이블에 157 개의 행이 있으므로 157 개의 결과가 발생합니다. 이것을보십시오 : SELECT GETOVERUREN (1,2013) FROM DUAL; – AndyDan