如何创建PL/SQL触发器来检测插入或更新的行并更新另一个表中的记录?



我正在为自己创建一个图书跟踪数据库,其中包含有关我的图书的信息,并允许我跟踪谁在借书。我正在尝试在我的checkout表上创建一个触发器,如果添加或更新了记录,则该触发器将确定是否已输入checkout数据或是否已输入签入日期,并更改"可用"。字段到";Y"或"N".

我已经创建了一个名为" update_book_availability& quot;在我的Checkouts表,但我一直得到这个错误:

pl -00103:在执行下列操作时遇到符号'end- file':(开始情况声明和异常退出goto if循环mod null pragma raise返回select update while with <<继续关闭当前删除取锁插入打开回滚保存点设置sql执行提交所有合并标准管道清除json_object
错误:检查编译器日志

下面是我的触发代码:
CREATE OR REPLACE NONEDITIONABLE TRIGGER "UPDATE_BOOK_AVAILABILITY"
AFTER INSERT OR UPDATE OF ISBN, PersonID, checkout_date, checkin_date
ON Checkouts
FOR EACH ROW
BEGIN
IF :NEW.checkout_date = NULL
THEN
UPDATE Book
SET available = 'N'
WHERE ISBN IN (SELECT :NEW.ISBN FROM Checkouts);
END IF;
END;

这是我的ERD的图像:

ERD

我一直在研究和双重检查我的触发语法,如果条件语法,子查询语法,并搜索此错误,但没有发现任何帮助。我是PL/SQL的新手,希望能帮助我理解我做错了什么或错过了什么。

  • PLS-00103:遇到符号文件结束错误是语法错误
  • 复制你的触发器并将其调整到我的一个测试表-它有效。我删除了NONEDITIONABLE,并更改了触发器表名以及列名和表/列被触发器更新。
    To Do:
  • 再次检查语法或重新编写触发器
  • "…Where isbn in (select: new。ISBN FROM checkout)…"选择一个固定值(每一行):NEW。触发表的ISBN,更好->>"…其中isbn =: new。ISBN…">
  • 很确定你不需要NONEDITIONABLE触发器为你的图书跟踪应用程序…
    问候…

最新更新