2011-12-14 74 views
0

爲什麼這給我錯誤?警告:使用編譯錯誤創建的過程?

CREATE OR REPLACE trigger customerLineCount 
BEFORE insert on cust_line 
for each row 
when(new.cust_id > 0) 
DECLARE 
    lineCount number; 
BEGIN 
    select count (*) into lineCount 
    from (cust_line inner join customer 
    on cust_line.cust_id = customer.cust_id) 
    where (customer.cust_id = :new.cust_id) 

    if :new.gender = "m" and lineCount = 3 THEN 
     dbms_output.put_line ('Error! User already has 3 lines'); 
    elseif :new.gender = "f" and lineCount = 1 THEN 
     dbms_output.put_line ('Error! User already has 1 line'); 
    end if; 
END customerLineCount; 
/
+4

請運行`show errors`來查看編譯錯誤消息是什麼(或者從user_errors等中選擇它) – derobert 2011-12-14 18:50:18

回答

3

在正文中首次選擇後缺少分號。

5

1)PL/SQL中的字符串由單引號分隔,而不是雙引號。所以,如果你想檢查gender是什麼,你需要像

if :new.gender = 'm' and lineCount = 3 THEN 
    dbms_output.put_line ('Error! User already has 3 lines'); 
elseif :new.gender = 'f' and lineCount = 1 THEN 
    dbms_output.put_line ('Error! User already has 1 line'); 
end if; 

2)你SELECT語句丟失在最後一個分號。

3)但是,一旦解決了編譯錯誤,幾乎肯定會遇到運行時錯誤。通常,表上的行級觸發器不能查詢同一個表。因此您在cust_line上的行級觸發器無法查詢cust_line表。您可以通過創建一個包含PL/SQL集合的包然後創建多個觸發器來解決這個問題。 before語句觸發器會初始化集合,行級觸發器會使用新插入行中的鍵填充集合。然後,一個after語句觸發器將遍歷集合,查詢表並應用所需的任何業務邏輯。然而,這是一個非常複雜的方法,在實踐中很少需要。通常,使用約束而不是觸發器或通過執行插入的存儲過程中的業務規則可以更好地服務您。

+0

+1用於推薦使用觸發器的約束 – 2011-12-15 10:14:56