旧条件不等于新条件的Oracle触发器以错误PLS-00049、PL/SQL:ORA-00933结束
假设am在名为EMPLOYEES的主表上有数据,数据示例如下: 员工旧条件不等于新条件的Oracle触发器以错误PLS-00049、PL/SQL:ORA-00933结束,oracle,plsql,triggers,database-trigger,Oracle,Plsql,Triggers,Database Trigger,假设am在名为EMPLOYEES的主表上有数据,数据示例如下: 员工 +--------+----------+ | EMP_ID | EMP_NAME | +--------+----------+ | 100 | Smith | | 200 | Clark | +--------+----------+ +--------+----------+ | EMP_ID | EMP_NAME | +--------+----------+ |
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Smith |
| 200 | Clark |
+--------+----------+
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Blake | <---- UPDATE with different value
| 200 | Clark | <---- UPDATE with same value
| 300 | Mary | <---- INSERT
+--------+----------+
+----+--------+--------------+--------------+
| ID | EMP_ID | OLD_EMP_NAME | NEW_EMP_NAME |
+----+--------+--------------+--------------+
| 1 | 100 | Smith | Blake |
| 2 | 300 | NULL | Mary |
+----+--------+--------------+--------------+
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Karla | <---- UPDATE with NEW value
| 200 | Clark | <---- UPDATE with same value
| 300 | James | <---- UPDATE with NEW value
| 400 | Sofia | <---- INSERT
+--------+----------+
+----+--------+--------------+--------------+
| ID | EMP_ID | OLD_EMP_NAME | NEW_EMP_NAME |
+----+--------+--------------+--------------+
| 1 | 100 | Blake | Karla |
| 2 | 300 | Mary | James |
| 3 | 400 | NULL | Sofia |
+----+--------+--------------+--------------+
现在,如果表格插入了新数据或更新了现有数据;然后数据如下所示:
员工
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Smith |
| 200 | Clark |
+--------+----------+
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Blake | <---- UPDATE with different value
| 200 | Clark | <---- UPDATE with same value
| 300 | Mary | <---- INSERT
+--------+----------+
+----+--------+--------------+--------------+
| ID | EMP_ID | OLD_EMP_NAME | NEW_EMP_NAME |
+----+--------+--------------+--------------+
| 1 | 100 | Smith | Blake |
| 2 | 300 | NULL | Mary |
+----+--------+--------------+--------------+
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Karla | <---- UPDATE with NEW value
| 200 | Clark | <---- UPDATE with same value
| 300 | James | <---- UPDATE with NEW value
| 400 | Sofia | <---- INSERT
+--------+----------+
+----+--------+--------------+--------------+
| ID | EMP_ID | OLD_EMP_NAME | NEW_EMP_NAME |
+----+--------+--------------+--------------+
| 1 | 100 | Blake | Karla |
| 2 | 300 | Mary | James |
| 3 | 400 | NULL | Sofia |
+----+--------+--------------+--------------+
对于下一次迭代,当员工表再次更新为新数据集时,如下所示:
员工
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Smith |
| 200 | Clark |
+--------+----------+
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Blake | <---- UPDATE with different value
| 200 | Clark | <---- UPDATE with same value
| 300 | Mary | <---- INSERT
+--------+----------+
+----+--------+--------------+--------------+
| ID | EMP_ID | OLD_EMP_NAME | NEW_EMP_NAME |
+----+--------+--------------+--------------+
| 1 | 100 | Smith | Blake |
| 2 | 300 | NULL | Mary |
+----+--------+--------------+--------------+
+--------+----------+
| EMP_ID | EMP_NAME |
+--------+----------+
| 100 | Karla | <---- UPDATE with NEW value
| 200 | Clark | <---- UPDATE with same value
| 300 | James | <---- UPDATE with NEW value
| 400 | Sofia | <---- INSERT
+--------+----------+
+----+--------+--------------+--------------+
| ID | EMP_ID | OLD_EMP_NAME | NEW_EMP_NAME |
+----+--------+--------------+--------------+
| 1 | 100 | Blake | Karla |
| 2 | 300 | Mary | James |
| 3 | 400 | NULL | Sofia |
+----+--------+--------------+--------------+
使用触发器,我得到如下错误:
错误PLS-00049,PL/SQL:ORA-00933
我提前向你们表示感谢,并感谢你们的帮助
谢谢,Richa触发器代码错误:
- 触发器声明中的关键字之前没有
- 您已经说过,它将在插入或更新之前触发;你也不必把它放到IF中
- 如果你把它放在那里,那么要小心:当有
或
时,如果你不把操作符括在括号里,你会破坏一切。这将是
如果(更新或插入)和(:old.emp\u name:new.emp\u name),那么…
- 注意空值!插入时,没有旧值
INSERT-to
- 您没有填充
表中的AUDIT
列;我选择使用序列ID
BEGIN
和多余的WHERE
)的组合导致了ORA-00933(SQL命令未正确结束)错误
下面是一个完整的示例:
[编辑:每个员工只保留一行]
在我看来,你不应该这样做-如果你已经丢失了所有以前的修改,这是一种什么样的审计?无论如何,以下是触发代码:
- 首先,它更新一行
- 如果
不存在,EMP\u ID
将不会执行任何操作,UPDATE
将为0SQL%ROWCOUNT
- 在这种情况下,
插入一行
- 触发器声明中的关键字之前没有
- 您已经说过,它将在插入或更新之前触发;你也不必把它放到IF中
- 如果你把它放在那里,那么要小心:当有
或
时,如果你不把操作符括在括号里,你会破坏一切。这将是
如果(更新或插入)和(:old.emp\u name:new.emp\u name),那么…
- 注意空值!插入时,没有旧值
INSERT-to
- 您没有填充
表中的AUDIT
列;我选择使用序列ID
BEGIN
和多余的WHERE
)的组合导致了ORA-00933(SQL命令未正确结束)错误
下面是一个完整的示例:
[编辑:每个员工只保留一行]
在我看来,你不应该这样做-如果你已经丢失了所有以前的修改,这是一种什么样的审计?无论如何,以下是触发代码:
- 首先,它更新一行
- 如果
不存在,EMP\u ID
将不会执行任何操作,UPDATE
将为0SQL%ROWCOUNT
- 在这种情况下,
插入一行
谢谢@Littlefoot。我非常感谢你的帮助。非常感谢您的详细解释、重新编写代码以及为我节省大量时间。我用AFTER insert语句编写了代码,我想在格式化时可能已经删除了。我的错。我有一个问题:如果我必须在EMPLOYEES表中添加另一列,如“PAYMENT_HOLD”,并带有Y和N值,并且如果我必须在EMPLOYEES_AUDITS表中捕获这些更改,我必须只修改if部分,对吗?如下:
if((nvl(:old.emp_name,'-1')nvl(:new.emp_name,'-1'))或(nvl(:old.payment_hold,'-1')nvl(:new.payment_hold,'-1'))
。作为一个新的条件,是的-如果你想检查它,使用OR.Awesome@Littlefoot。再次感谢您的快速回复。我非常感谢您的时间和帮助,一点问题也没有:)Hi@Littlefoot,我尝试了几次使用不同数据集的迭代,并注意到,由于为insert语句指定了条件,我得到了重复的EMP_ID。如果emp_id已经存在,我是否应该包含update语句?我只需要员工审核表中唯一的emp\u id。我是否应该将代码修改为BEGIN。。。如果插入,则。。。如果nvl(:old.emp_name,'-1')nvl(:new.emp_name,'-1'),则。。插入到…
如果更新,则插入到…如果更新,则插入到。。。nvl(:old.emp_name,'-1')nvl(:new.emp_name,'-1')然后。。更新位置…我很抱歉问了太多问题Hanks@Littlefoot。我非常感谢你的帮助。非常感谢您的详细解释、重新编写代码以及为我节省大量时间。我用AFTER insert语句编写了代码,我想在格式化时可能已经删除了。我的错。我有一个问题:如果我必须在EMPLOYEES表中添加另一列,如“PAYMENT_HOLD”,并带有Y和N值,并且如果我必须在EMPLOYEES_AUDITS表中捕获这些更改,我必须只修改if部分,对吗?如下:if((nvl(:old.emp_name,'-1')nvl(:new.emp_name,'-1'))或(nvl(:old.payment_hold,'-1')nvl(:new.payment_hold,'-1'))
。作为一个新的条件,是的-如果你想检查它,使用OR.Awesome@Littlefoot。再次感谢您的快速回复。我非常感谢您的时间和帮助,一点问题也没有:)Hi@Littlefoot,我尝试了几次使用不同数据集的迭代,并注意到,由于为insert语句指定了条件,我得到了重复的EMP_ID。如果emp_id已经存在,我是否应该包含update语句?我只需要员工审核表中唯一的emp\u id。我是否应该将代码修改为BEGIN。。。如果插入,则。。。如果nvl(:old.emp_name