将 mysql 触发器转换为 pl/sql 触发器

Converting mysql trigger to pl/sql trigger

我之前为我的 mysql 项目创建了一个触发器,并且运行良好。但是,我正在尝试更改此触发器以使其适用于 pl-sql(oracle)。这是我在 mysql:

中工作的原始代码
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;
/ 

至少,您在这一行中有语法错误:

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

那应该只是 =.

另外,在 Oracle 中,DECLARE 在 [=16= 之前,而不是在之后。

此外,在 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;