触发存储过程运行而不是 INSERT (PL/SQL)

Posted

技术标签:

【中文标题】触发存储过程运行而不是 INSERT (PL/SQL)【英文标题】:Triggering a stored procedure to run instead of INSERT (PL/SQL) 【发布时间】:2013-04-28 04:19:42 【问题描述】:

给定一个简单的员工表(id、lastname、firstname),任务要求我编写一个 stor proc,它接受名字和姓氏,计算下一个 id 并将新记录插入表中。就这样完成了。下一部分要求编写一个触发器,每当发生新的 INSERT 时,该触发器将调用此存储过程。我的理解是,这个触发器应该拦截触发它的插入语句,提取它的参数并运行插入的 stor proc INSTEAD(不是之前或之后)。问题是,instead-of 触发器似乎只适用于我不允许编写的视图。关于如何解决这个问题的任何想法?

感谢您的意见!

【问题讨论】:

基本上,INSERT 甚至不应该接触表格 - 它的所有工作都需要由 stor proc 执行。有没有办法通过前/后触发机制来实现这一点? 我想说这是不可能的,请在此处查看 Tom Kyte 的评论:asktom.oracle.com/pls/apex/…。如果这个任务真的是要求你在一个表上写一个代替触发器,那么这是一个愚蠢的任务。 这就是我对它的感觉。谢谢你的链接。 实际上它只需要我使用触发器->存储过程方法。不指定使用什么类型的触发器。似乎 BEFORE 和 AFTER 触发器不会阻止插入的发生。你知道 BEFORE 触发器是否可以“覆盖”插入语句吗? 如果触发器的目的只是设置一个新的 ID,那么你可以使用 BEFORE 触发器来设置 ID,然后让插入发生。在 BEFORE 触发器中,您可以分配给 :new.columnname 以更改插入到列中的值。 【参考方案1】:

在 Oracle 中有序列。因此,您可以创建一个序列,然后每次在触发器之前的插入中分配下一个序列号。示例可以在这里找到

http://www.adp-gmbh.ch/ora/concepts/sequences.html

这里

http://www.adp-gmbh.ch/ora/sql/trigger/before_after_each_row.html

如果您现在可以完成这项任务,或者您需要更多帮助,请告诉我。

【讨论】:

以上是关于触发存储过程运行而不是 INSERT (PL/SQL)的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 触发器 基础

触发器

触发器

Sql触发器是同步还是异步?

存储过程的触发器

触发器