2010-05-20 47 views
0

UPDATE語句我在Oracle數據庫這樣的存儲過程:問題與存儲過程在Oracle數據庫

create or replace 
PROCEDURE EDYTUJ_PRACOWNIKA 
    (PR_IMIE IN VARCHAR2, PR_NAZWISKO IN VARCHAR2, PR_PENSJA IN FLOAT, 
    PR_PRZELOZONY IN NUMBER, PR_ODDZIAL IN NUMBER, PRAC_ID IN NUMBER) 
AS 
tmpPensja FLOAT := 0; 
tmpPrzel NUMBER := 0; 
BEGIN 
    select przelozony into tmpPrzel from pracownik where id = PRAC_ID; 
    IF(tmpPrzel IS NOT NULL) THEN 
    select pensja into tmpPensja from pracownik where id = tmpPrzel; 
    IF(tmpPensja < 1150) THEN 
     UPDATE PRACOWNIK SET pensja = 1000 WHERE id = tmpPrzel; 
    ELSE 
     UPDATE PRACOWNIK SET pensja = pensja - 150 WHERE id = tmpPrzel; (4) 
    END IF; 
    END IF; 

    IF(PR_PRZELOZONY > 0) THEN 
    UPDATE PRACOWNIK SET imie = PR_IMIE, nazwisko = PR_NAZWISKO, pensja = PR_PENSJA, przelozony = PR_PRZELOZONY, 
     oddzial = PR_ODDZIAL WHERE id = PRAC_ID; (2) 
    select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY; 

    IF(tmpPensja > 4850) THEN 
     UPDATE PRACOWNIK SET pensja = 5000 WHERE id = PR_PRZELOZONY; 
    ELSE 
     UPDATE PRACOWNIK SET pensja = pensja + 150 WHERE id = PR_PRZELOZONY; (1) 
    END IF; 
    ELSE 
    UPDATE PRACOWNIK SET imie = PR_IMIE, nazwisko = PR_NAZWISKO, pensja = PR_PENSJA, przelozony = NULL, 
     oddzial = PR_ODDZIAL WHERE ID = PRAC_ID; (3) 
    END IF; 
END; 

其中przelozony和pensja在pracownik表列。

我有一個問題,當運行帶有標記爲「(1)」(帶有標記爲「(4)」的行的相同問題的參數)的過程時,應執行該更新語句不有什麼影響。標有「(2)」和「(3)」的行更多的語句正常工作。

我不知道如何解決它。預先感謝您的幫助。

回答

0

很難用外表和列名讀取代碼,所以我希望我知道它是正確的(沒有冒犯) - 但請務必仔細閱讀。

據我瞭解你的代碼,你應該能夠刪除你的臨時變量,並在三個後續的更新語句(更新不同的行)中做所有事情。我不知道究竟哪種方法不起作用,但如果它仍然不起作用,請嘗試手動執行單個SQL語句並檢查結果。


更新pracownik,通過150減少pensja但不低於1000其中id = przelozony(prac_id)

UPDATE pracownik 
SET pensja = LEAST(pensja-150, 1000) 
WHERE id = (SELECT przelozony FROM pracownik where id = PRAC_ID); 

更新pracownik,設置一些值,和przelozony

UPDATE pracownik 
SET imie = PR_IMIE, 
    nazwisko = PR_NAZWISKO, 
    pensja = PR_PENSJA, 
    przelozony = CASE WHEN PR_PRZELOZONY > 0 THEN PR_PRZELOZONY ELSE NULL END, 
    oddzial = PR_ODDZIAL 
WHERE id = PRAC_ID; 

更新pracownik如果PR_PRZELOZONY > 0,增加pensja通過15,但不高於5000

IF(PR_PRZELOZONY > 0) THEN 
    UPDATE pracownik 
    SET pensja = GREATEST(pensja + 150, 5000) 
    WHERE id = pr_przelozony; 
END IF; 
1

幾乎可以肯定你認爲你擁有的價值不是你實際擁有的價值。例如,如果這個語句返回一個NULL

select przelozony into tmpPrzel from pracownik where id = PRAC_ID; 

語句(4)將永遠不會執行。同樣,如果返回null

select pensja into tmpPensja from pracownik where id = PR_PRZELOZONY; 

語句(1)將永遠不會執行。爲了檢查這個,你需要在你的代碼中添加一些跟蹤語句,或者通過一個調試器來運行它。

將跟蹤放入程序的最快方法是使用DBMS_OUTPUT.PUT_LINE並在SQL * Plus(或使用IDE)的客戶端中運行存儲過程。

select przelozony into tmpPrzel from pracownik where id = PRAC_ID; 
dbms_output.put_line('PRAC_ID ='|| PRAC_ID ||':: tmpPrze='|| tmpPrze); 
IF(tmpPrzel IS NOT NULL) THEN 
    select pensja into tmpPensja from pracownik where id = tmpPrzel; 
    dbms_output.put_line('tmpPrzel IS NOT NULL:: tmpPensja='|| tmpPensja); 
    ... 

所有最流行的PL/SQL的IDE - Ouest的蟾蜍,全能化自動化PL/SQL Developer和Oracle SQL Developer中提供的調試。您可以在SQL Developer here on OTN中找到調試說明。