【问题标题】:How can i call a function via trigger in Oracle SQL?如何通过 Oracle SQL 中的触发器调用函数?
【发布时间】: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。实际上,这只是实验室实验中的一个我无法解决的问题。我可以简单地使用一个过程或只使用触发器来完成你所说的工作,但它说,使用函数和触发器对于这个问题是强制性的。而且我知道日志表应该有一些额外的信息,比如日期和时间。但正如我所说,这只是一个简单的实验室问题。

标签: sql oracle function plsql


【解决方案1】:
  1. 不要使用函数。函数用于读取数据并返回值。使用程序。过程用于修改数据。

  2. 您的程序需要接受参数。它无法访问:new 伪记录。

听起来你想要这样的东西

CREATE OR REPLACE procedure insert_history( 
  p_cid in course.cid%type,
  p_cname in course.cname%type,
  p_credit in course.credit%type,
  p_did in course.did%type
)
as
BEGIN
    INSERT INTO course_history( cid, cname, credit, did )
    VALUES(p_cid, p_cname, p_credit, p_did);
END;



CREATE OR REPLACE TRIGGER trig
AFTER UPDATE OF CREDIT ON COURSE
FOR EACH ROW
BEGIN
   insert_history( :new.cid, :new.cname, :new.credit, :new.did );
END;

【讨论】:

  • 感谢您的回答。实际上这是一个实验室实验问题,并且必须使用函数和触发器。我认为这只是一个写得不好的问题。
猜你喜欢
  • 2020-02-20
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多