【问题标题】:SQL TRIGGER (Compilation errors)SQL TRIGGER(编译错误)
【发布时间】:2016-10-22 16:21:16
【问题描述】:

我是第一次用 SQL 编写触发器。谁能告诉我我在这段代码中写错了什么?

SQL> CREATE OR REPLACE TRIGGER Course_Allocation_After_Update
2  AFTER UPDATE
3  ON COURSE_ALLOCATION
4  FOR EACH ROW
5  DECLARE
6  v_user_id varchar2(20);
7  BEGIN
8  --Finding User who is performing the update in the table
9  SELECT USER
10  INTO v_user_id
11  FROM dual;
12  --Inserting Information Into Staging Table (Log Table)
13  IF UPDATING(STU_ID)   
14  THEN
15  INSERT INTO STAGING_TABLE
16  (user_id,old_value,new_value,date_when_updated,time_when_udated)
17  VALUES
18  (v_user_id,:old.STU_ID,:new.STU_ID,sysdate,systime)
19  END IF;
20  END;
21  /
Warning: Trigger created with compilation errors.

这些是错误:
11/1 PL/SQL:忽略 SQL 语句 14/53 PL/SQL:ORA-00933:SQL 命令未正确结束 16/4 PLS-00103:遇到符号“;”当期待其中之一 下列的: 如果

【问题讨论】:

  • 仅供参考,这是一个 PL/SQL 触发器。 PL/SQL 是编程语言。并且没有法律规定您必须以大写形式进行编码。我个人觉得很难阅读。

标签: sql oracle plsql triggers compiler-errors


【解决方案1】:
  1. 插入子句后的忘记分号;
  2. systime - 在 Oracle 中不存在。 SYSDATE - 已经包含有关时间的信息。如果你想将它分开,你可以使用trunc(sysdate) - 只返回日期和 to_char(sysdate,'HH24:MI:SS') - 返回带有时间的字符串。或者你的意思是systimestamp
  3. (可选)为什么需要选择用户进入变量?只需将其用作价值

我的触发器版本代码:

 CREATE OR REPLACE TRIGGER Course_Allocation_After_Update
 AFTER UPDATE
 ON COURSE_ALLOCATION
 FOR EACH ROW
 DECLARE
 v_user_id varchar2(20);
 BEGIN
 --Inserting Information Into Staging Table (Log Table)
 IF UPDATING(STU_ID)   
 THEN
 INSERT INTO STAGING_TABLE
 (user_id,old_value,new_value,date_when_updated)
 VALUES
 (USER,:old.STU_ID,:new.STU_ID,sysdate);
 END IF;
 END;
 /

【讨论】:

  • 感谢您指出这些错误。我做了一些改变。但是还是有错误。
  • 创建或替换触发器 Course_Allocation_After_Update 更新后每行的 COURSE_ALLOCATION 声明 v_STU_ID varchar2(20); BEGIN --在表中查找正在执行更新的用户 SELECT STU_ID INTO v_STU_ID FROM COURSE_ALLOCATION; --Inserting Information into Staging Table (Log Table) IF UPDATING(STU_ID) THEN INSERT INTO STAGING_TABLE (user_id,old_value,new_value,date_when_updated) VALUES (USER,:old.v_STU_ID,:new.v_STU_ID,sysdate);万一;结尾; /
【解决方案2】:

试试这个:

CREATE OR REPLACE TRIGGER Course_Allocation_After_Update 
AFTER UPDATE ON COURSE_ALLOCATION 
referencing old as old new as new
FOR EACH ROW 

DECLARE 
    v_STU_ID varchar2(20); 

BEGIN --Finding User who is performing the update in the table 
    SELECT STU_ID 
    INTO v_STU_ID 
    FROM COURSE_ALLOCATION; 

    --Inserting Information Into Staging Table (Log Table) 
    IF UPDATING('STU_ID') 
    THEN 
        INSERT INTO STAGING_TABLE (user_id,old_value,new_value,date_when_updated) 
        VALUES (USER,:old.v_STU_ID,:new.v_STU_ID,sysdate); 
    END IF; 
 END; 
 / 

在我看来:

SELECT STU_ID 
INTO v_STU_ID 
FROM COURSE_ALLOCATION;

不能很好,因为你会从 course_allocation 表中选择所有的 stu_id 记录。这会给你一个“too_many_rows”错误。 course_allocation 表是什么样子的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多