旧条件不等于新条件的Oracle触发器以错误PLS-00049、PL/SQL:ORA-00933结束

旧条件不等于新条件的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 | +--------+----------+ |

假设am在名为EMPLOYEES的主表上有数据,数据示例如下:

员工

+--------+----------+
| 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
    将不会执行任何操作,
    SQL%ROWCOUNT
    将为0
  • 在这种情况下,
    插入一行

触发代码错误:

  • 触发器声明中的关键字之前没有
  • 您已经说过,它将在插入或更新之前触发;你也不必把它放到IF中
  • 如果你把它放在那里,那么要小心:当有
    时,如果你不把操作符括在括号里,你会破坏一切。这将是
    如果(更新或插入)和(:old.emp\u name:new.emp\u name),那么…
  • 注意空值!插入时,没有旧值
  • INSERT-to
  • 您没有填充
    AUDIT
    表中的
    ID
    列;我选择使用序列
上述内容(尤其是缺少
BEGIN
和多余的
WHERE
)的组合导致了ORA-00933(SQL命令未正确结束)错误

下面是一个完整的示例:

[编辑:每个员工只保留一行]

在我看来,你不应该这样做-如果你已经丢失了所有以前的修改,这是一种什么样的审计?无论如何,以下是触发代码:

  • 首先,它更新一行
  • 如果
    EMP\u ID
    不存在,
    UPDATE
    将不会执行任何操作,
    SQL%ROWCOUNT
    将为0
  • 在这种情况下,
    插入一行


谢谢@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