【发布时间】:2021-07-11 14:15:19
【问题描述】:
(我正在使用 Oracle Database XE 18c 和 SQL Developer)
我们有一个名为“courses”的表(cid:varchar2,cname:varchar2,credit:integer,did:integer),我们有一个名为“course_history”的表,具有相同的属性。
当更新课程表的学分属性时,触发器应调用函数,该函数应将旧属性值插入“course_history”。
触发器和函数:
CREATE OR REPLACE FUNCTION fun RETURN VOID IS
BEGIN
INSERT INTO course_history
VALUES(:OLD.cid, :OLD.cname, :OLD.credit, :OLD.did);
END;
CREATE OR REPLACE TRIGGER trig
AFTER UPDATE OF CREDIT ON COURSE
FOR EACH ROW
BEGIN
-- ???
END;
如何在触发器中调用函数?另外,PLSQL中是否有可能返回void的函数?
谢谢。
【问题讨论】:
-
is it possible that a function to return void in PLSQL。如果您可以在触发器中编写相同的插入,为什么还需要一个函数来插入一些记录?即使是功能:您可以使用过程来完成此任务。您是否尝试过编写实际代码并自己进行测试?
-
这不是一个好用的函数。函数的正确使用是简单地向调用者返回一个值。查看 SQL 语言参考中的所有函数。它们都不会修改存储的数据。只需将您想象的功能的操作直接编码到触发器中即可。继续..
-
... cont... i也就是说,您的表结构看起来很可疑 为什么两个表具有 相同 结构?我认为历史记录表应该有一些额外的列来显示生效日期等。如果我参加了一门课程并获得了 5 个学分,我不希望在几年后重新调整课程结构时将其减少到 3 个学分。
-
您的模型还缺少可以识别历史记录的东西:SQL 表没有行顺序,因此应该有一些额外的列来识别进行更改时的时间/事件/顺序。
-
感谢大家的cmets。实际上,这只是实验室实验中的一个我无法解决的问题。我可以简单地使用一个过程或只使用触发器来完成你所说的工作,但它说,使用函数和触发器对于这个问题是强制性的。而且我知道日志表应该有一些额外的信息,比如日期和时间。但正如我所说,这只是一个简单的实验室问题。