2013-10-25 69 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.) 

/*當我使用功能的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

你必須移動v_min_uren_id變量的增量內循環(這從最大改變MIN) - 否則,你會得到一個inifite循環。試試這個:

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,這確實是我的錯誤,我總是錯過了我的++我的循環部分....但是,我stil得到許多結果(157),而不是隻有1個結果,v_resultaat。任何想法,爲什麼? – user2919688

+0

@ user2919688請編輯您的原始問題並添加:來自您表格的示例數據,用於執行第二個函數的代碼塊,您得到的輸出以及您期望的輸出。 –

+0

@ user2919688,你會得到157個結果,因爲UREN表中有157行。試試這個:SELECT GETOVERUREN(1,2013)FROM DUAL; – AndyDan