sql - 在 PL/SQL 中的 View 上触发

标签 sql oracle plsql view triggers

我想用 PL/SQL 编写一个触发器。我的第一个目标是比较两种 time_stamp 数据类型(A 和 B)。如果其中一个比另一个大,例如 A>B,我将更新另一个表上的列。我尝试编写的触发器如下所示。

CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT OR UPDATE OR DELETE ON views
FOR EACH ROW
  DECLARE
    A views.X%TYPE;
    B views.Y%TYPE;
    C views.Z%TYPE;
BEGIN
  SELECT X, Y, Z INTO A, B, C FROM views;
  IF A>B THEN
  update another_table set D=' ' and E='UNRESOLVED' where column1=A;
  ELSE
  dbms_output.put_line('ABC: ' || A || ' < ' || 'CDE' || B);
  END IF;
END;

如果我执行此触发器,我会收到如下错误。

错误报告: ORA-25001: 可以看到触发器类型和类型之间的关系 25001. 00000 - “无法在 View 上创建此触发器类型” *原因: View 上只能创建 INSTEAD OF 触发器。 *操作:将触发器类型更改为 INSTEAD OF。

预先感谢您的帮助。

最佳答案

你就快到了。这只是语法上的困惑。您无法创建在插入、更新或删除 View BEFOREAFTER时触发的触发器,但可以创建在INSTEAD OF触发的触发器> 插入或更新或删除:

插入、更新或删除之前/之后的表 查看而不是插入、更新或删除

并且,正如 @Belayer 所写,您不(也不应该)使用 SELECT,在插入或更新期间使用自动准备的名为 :new 的记录作为新值,或者使用记录':old' 表示更新或删除期间的旧值。

你的触发器看起来像这样:

CREATE OR REPLACE TRIGGER views_tr
  INSTEAD OF INSERT OR UPDATE OR DELETE ON views
  FOR EACH ROW
BEGIN
  IF :new.x > :new.y THEN
    UPDATE another_table SET D=' ', ... WHERE column1 = :new.x;
  ELSE
    dbms_output.put_line('ABC: ' || :new.x || ' < ' || 'CDE' || :new.y);
  END IF;
END views_tr;
/

关于sql - 在 PL/SQL 中的 View 上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62325753/

相关文章:

java - 尝试使用 JSP 搜索相似图像时出错

java - 如何在 Java 中构造 oracle.sql.ANYDATA 并将其传递到 PL/SQL 过程中

oracle - 如何确保 PL/SQL 程序在编译时启用了优化?

sql - 是否有更好的Oracle运算符(operator)进行空安全相等检查?

Oracle:将行类型数据插入另一个表

mysql - 如何查询给定固定值的值的百分比

sql - SELECT * FROM Employees WHERE NULL IS NULL; SELECT * FROM 员工 WHERE NULL = NULL;

sql - 如何从两个 SQL 表中获取不匹配的记录?

Oracle 11 查询在前 2 次执行时运行速度快,后续运行速度较慢,没有计划更改

oracle - 从 XMLTABLE 中获取时,此 SELECT 语句错误中需要 INTO 子句