2016-01-09 83 views
1

我之前爲我的mysql項目創建了一個觸發器,它運行良好。不過,我試圖改變這個觸發器,以適合pl-sql(oracle)。這是我原來的代碼在MySQL工作:將mysql觸發器轉換爲pl/sql觸發器

DELIMITER $$ 
CREATE TRIGGER course_title_delete AFTER DELETE on Course 
FOR EACH ROW 
BEGIN 
DECLARE rownumber INT; 
SET rownumber = (SELECT COUNT(*) FROM Course 
    WHERE Course_code=old.Course_code); 
IF rownumber = 0 
THEN 
DELETE FROM Course_title 
    WHERE Course_title.Course_code=old.Course_code; 
    END IF; 
END$$ 
DELIMITER ; 

而這一次是我試圖轉換PL-SQL格式相同的代碼。但是,當我作爲腳本上傳並嘗試在頂點運行時,它不起作用。

CREATE OR REPLACE TRIGGER course_title_delete 
AFTER DELETE ON course 
FOR EACH ROW 
BEGIN 
DECLARE rownumber INT; 
SET rownumber = (SELECT COUNT(*) FROM course 
    WHERE course_code= :old.course_code); 
IF rownumber = 0 
THEN 
DELETE FROM course_title 
    WHERE course_title.course_code:=:old.course_code; 
    END IF; 
END; 
/
+0

什麼是錯誤? 「不工作」是什麼意思?在這兩個數據庫中,它看起來像可以用級聯外鍵約束替換觸發器。 –

+0

「錯誤在第3行:PLS-00103:遇到符號」=「當期望以下之一時::。(@%;非空範圍默認字符」這是錯誤,當我在apex sql中運行它時腳本部分 –

回答

1

最起碼,你在這一行中有語法錯誤:

DELETE FROM course_title 
    WHERE course_title.course_code:=:old.course_code; 
----------------------------------^ 

這應該只是=

另外,在Oracle中,DECLAREBEGIN之前,而不是在之後。

另外,在Oracle中,這條線:

SET rownumber = (SELECT COUNT(*) FROM course 
    WHERE course_code= :old.course_code); 

應該是:

SELECT COUNT(*) INTO rownumber 
FROM course 
WHERE course_code = :old.course_code; 

嗯,其實,該是你表達什麼正確的語法。但是,您應該在兩個數據庫中都使用NOT EXISTS而不是COUNT(*)

在這兩個數據庫中,我認爲你可以用級聯刪除外鍵約束替換這個觸發器。此外,您可以簡化邏輯以消除if

CREATE OR REPLACE TRIGGER course_title_delete 
AFTER DELETE ON course 
FOR EACH ROW 
BEGIN 
    DELETE FROM course_title 
    WHERE NOT ExISTS (SELECT 1 
         FROM course c 
         WHERE c.course_code = :old.course_code 
        ) AND 
      course_code = :old.course_code; 
END; 
+0

先生,我是數據庫新手,你能解釋一下,什麼是級聯刪除外鍵約束。你的意思是我的外鍵有問題嗎?當我把':='改爲'='時,它會給出這個錯誤「錯誤在第3行:PLS-00103:遇到下列之一時遇到符號」=「::=。(@%;非零範圍默認字符」 –

+0

@AliCanÜstünel...您不能是數據庫的新手如果你使用的是觸發器,下面是一個解釋:http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php。另外,MySQL文檔通常很好的解釋這些概念:http://dev.mysql。 com/doc/refman/5.7/en/create-table-foreign-keys.html。 –

+0

@GordonLinoff - 我很好奇 - 這是一個訪問定義觸發器的表(ORDER)的行觸發器,爲什麼這個觸發器不會在Oracle中引發「MUTATING TABLE」異常?謝謝。 –