将 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;
我之前为我的 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;