2016-12-11 33 views
0

編輯: 似乎已經排序它,認爲這只是我的表插入問題。PL/SQL塊功能和測試

好吧,所以我對PL/SQL相當新穎,所以對我來說很簡單,但我有這個代碼,我必須寫我必須檢查書的類別,如果它返回true我會有一個測試,將插入一行。有人能告訴我這有什麼問題嗎?謝謝。該函數正確執行,但我不完全確定它的語法是正確的,它只是給我錯誤的測試。

CREATE OR REPLACE FUNCTION CheckBookType (
    p_Type titles.category%TYPE) 
    RETURN BOOLEAN IS 

    v_ReturnValue  BOOLEAN; 
BEGIN 

    IF (p_Type) = 'business' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'psychology' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'mod_cook' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'trad_cook' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'popular_comp' THEN 
    v_ReturnValue := TRUE; 
    ELSE 
    v_ReturnValue := FALSE; 
    END IF; 

    RETURN v_ReturnValue; 
END CheckBookType; 

set serveroutput on; 
BEGIN 
    IF(CheckBookType('psychology'))=true THEN 
    INSERT INTO Titles VALUES(1234, 'test', 'psychology', sysdate, 1234); 
    ELSE 
    dbms_output.put_line('Invalid'); 
    END IF; 
END; 

回答

0

我看到你已經解決了這個問題,那很好。但這是你的IF聲明的另一個建議。如果v_ReturnValue設置爲TRUE,都是你在IF語句做,那麼你可以顯著縮短如下:

v_ReturnValue := FALSE; -- Or better yet, initialize it to FALSE in the declaration 
IF p_Type IN ('business', 'psychology', 'mod_cook', 'trad_cook', 'popular_comp') THEN 
    v_ReturnValue := TRUE; 
END IF; 

這樣做的缺點是,如果在某些時候,你需要做的不僅僅是設置v_ReturnValue更多對於p_Type的其中一些值爲TRUE,則需要再次展開IF語句。另一方面,這要短得多,並且可以更容易地添加或刪除您希望v_ReturnValue爲TRUE的p_Type的值。

0

乍一看對我來說很合適。 不過,我會建議使用CASE語句,而不是多個IF-THEN-ELSE語句:

CASE p_Type 
    WHEN 'business' THEN v_ReturnValue := TRUE; 
    WHEN 'psychology' THEN v_ReturnValue := TRUE; 
    WHEN 'mod_cook' THEN v_ReturnValue := TRUE; 
    WHEN 'trad_cook' THEN v_ReturnValue := TRUE; 
    WHEN 'popular_comp' THEN v_ReturnValue := TRUE; 
    ELSE v_ReturnValue := FALSE; 
END CASE 

我已經寫了CASE statement before,它可以在SQL和PL/SQL中使用。

+0

是的,一切看起來都很好,現在我只需要對錶格進行分類,並感謝他們似乎比不斷寫作IF更省力。 – Annihil8

+0

太棒了,很高興你解決了它! – bbrumm