【问题标题】:Trigger compiles without errors, But it does not add data触发器编译没有错误,但它不添加数据
【发布时间】:2017-06-23 17:21:07
【问题描述】:

在表“saturn.szraspr”发生更新或插入后,我正在尝试更新名为“saturn.szrunsp”的表。经过善意的建议,我创建了一个没有任何错误的触发器。但是,主要部分似乎仍然不起作用,这是在更新表 saturn.szraspr 后将数据添加到表 saturn.szrunsp 的触发器。请参阅下面的表格和触发器的所有代码。更新!!

-- INSERTING table --

        CREATE TABLE SATURN.SZRUNSP
    (
      SZRUNSP_STUDENT_NO       VARCHAR2(9 CHAR)     NOT NULL,
      SZRUNSP_PIDM             NUMBER(8)            NOT NULL,
      SZRUNSP_STUDENT_NAME     VARCHAR2(60 CHAR)    NOT NULL,
      SZRUNSP_SUSPEND_ACCOUNT  VARCHAR2(1 CHAR)     NOT NULL,
      SZRUNSP_UNSUSPEND_DATE   DATE                 NOT NULL,
      SZRUNSP_ACTIVITY_DATE    DATE                 NOT NULL,
      SZRUNSP_USER_ID          VARCHAR2(30 CHAR),
      SZRUNSP_ACTION           VARCHAR2(30 CHAR),
      SZRUNSP_SURROGATE_ID     NUMBER(19)           NOT NULL,
      SZRUNSP_VERSION          NUMBER(19)           NOT NULL,
      SZRUNSP_VPDI_CODE        VARCHAR2(6 CHAR)
    )


-- TRIGGER TABLE -- 

    CREATE TABLE SATURN.SZRASPR
(
  SZRASPR_STUDENT_NO             VARCHAR2(9 CHAR) NOT NULL,
  SZRASPR_STUDENT_NAME           VARCHAR2(60 CHAR) NOT NULL,
  SZRASPR_DATE_OF_BIRTH          VARCHAR2(8 CHAR) NOT NULL,
  SZRASPR_SUSPEND_ACCOUNT        VARCHAR2(1 CHAR) NOT NULL,
  SZRASPR_EMAIL_ADDRESS          VARCHAR2(100 CHAR) NOT NULL,
  SZRASPR_STUDENT_YEAR           VARCHAR2(2 CHAR) NOT NULL,
  SZRASPR_FACULTY                VARCHAR2(60 CHAR) NOT NULL,
  SZRASPR_SCHOOL_OF_STUDY        VARCHAR2(60 CHAR) NOT NULL,
  SZRASPR_DEGREE_NAME            VARCHAR2(100 CHAR) NOT NULL,
  SZRASPR_MODE_OF_STUDY          VARCHAR2(20 CHAR) NOT NULL,
  SZRASPR_FEE_STATUS             VARCHAR2(20 CHAR) NOT NULL,
  SZRASPR_YEAR_START             VARCHAR2(4 CHAR) NOT NULL,
  SZRASPR_SEMESTER_START         VARCHAR2(5 CHAR) NOT NULL,
  SZRASPR_ENROLMENT_STATUS       VARCHAR2(2 CHAR) NOT NULL,
  SZRASPR_LEAVING_DATE           VARCHAR2(8 CHAR),
  SZRASPR_PENDING_ACTIVITY_DATE  DATE,
  SZRASPR_ACTIVE_ACTIVITY_DATE   DATE,
  SZRASPR_PENDING_STATUS         VARCHAR2(2 CHAR),
  SZRASPR_ACTIVE_STATUS          VARCHAR2(2 CHAR),
  SZRASPR_PIDM                   NUMBER(8)      NOT NULL,
  SZRASPR_TERM_CODE              VARCHAR2(6 CHAR) NOT NULL,
  SZRASPR_ASPIRE_ERROR_REPORTED  VARCHAR2(10 CHAR),
  SZRASPR_ERROR_TEXT             VARCHAR2(100 CHAR),
  SZRASPR_SEQ_NO                 NUMBER,
  SZRASPR_SEND                   INTEGER,
  SZRASPR_SURROGATE_ID           NUMBER(19),
  SZRASPR_VERSION                NUMBER(19),
  SZRASPR_USER_ID                VARCHAR2(30 CHAR),
  SZRASPR_DATA_ORIGIN            VARCHAR2(30 CHAR),
  SZRASPR_ACTIVITY_DATE          DATE,
  SZRASPR_VPDI_CODE              VARCHAR2(6 CHAR)
);



--Trigger--

    CREATE OR REPLACE TRIGGER szrunsp_suspend_trigger
after update or insert on SATURN.SZRASPR
for each row     
declare
    SZRUNSP_USER_ID varchar2(30 CHAR);
begin
    select user into SZRUNSP_USER_ID from dual;

    insert into SATURN.SZRUNSP values
        (:new.SZRASPR_STUDENT_NO,
         :new.SZRASPR_PIDM,
         :new.SZRASPR_STUDENT_NAME,
         :new.SZRASPR_SUSPEND_ACCOUNT,
         SYSDATE,
         SYSDATE,
         user,
         :new.SZRASPR_SURROGATE_ID,
         :new.SZRASPR_VERSION,
         :new.SZRASPR_VPDI_CODE);
 end;
/

【问题讨论】:

  • VALUES ( , , d_account, , , SYSDA ??
  • 可以v_user_id := USER_ID。但话又说回来,为什么??
  • 我创建了一个系统,用户在该系统中将一些数据提交到搜索字段,然后将其保存到表“SZRASPR”中。如果表发生任何变化,则触发器应触发并保存到表'AUDIT_UNSUSPEND_TABLE'
  • 'ERROR OCCURED' 的拼写似乎是一个古老的 IT 传统。很高兴看到它;)
  • 你能澄清你的问题吗?它看起来语法正确 - 你有错误吗?

标签: sql oracle plsql database-trigger


【解决方案1】:

您正在将 NULL 值插入

  SZRUNSP_SURROGATE_ID     NUMBER(19)           NOT NULL,
  SZRUNSP_VERSION          NUMBER(19)           NOT NULL,

您只能对触发表上的列使用 :new 前缀 - 而不是在您要插入的表上

【讨论】:

    【解决方案2】:

    不知道为什么会出现此错误:

    [Error] ORA-00947 (9: 20): PL/SQL: ORA-00947: not enough values
    

    INSERT 语句中的值数与您发布的表相匹配。因此,如果您遇到该错误,您需要更正您的问题。

    [Error] PLS-00049 (10: 2): PLS-00049: bad bind variable 'NEW.SZRUNSP_STUDENT_NO'
    

    INSERT 语句中引用的所有列与目标表saturn.szrunsp 具有相同的名称。但是,绑定名称必须与触发表的列匹配。 saturn.szraspr。你说

    saturn.szraspr 有 szraspr_student_no 列

    所以你需要编辑触发器来匹配:

    CREATE OR REPLACE TRIGGER szrunsp_suspend_trigger
    after update or insert on szraspr
    for each row     
    declare
        szrunsp_user_id varchar2(30);
    begin
        select user into szrunsp_user_id from dual;
    
        insert into szrunsp values
            (:new.SZRASPR_STUDENT_NO,
             :new.SZRASPR_PIDM,
             :new.SZRASPR_STUDENT_NAME,
             :new.SZRASPR_SUSPEND_ACCOUNT,
             SYSDATE,
             SYSDATE,
             user,
             :new.SZRASPR_ACTION,
             '',
             '',
             '');
     end;
    /
    

    在 Oracle 中,空字符串是 null,因此您将在 SZRUNSP_SURROGATE_ID 和 SZRUNSP_VERSION 上遇到 NOT NULL 违规,您需要处理这些违规行为。

    【讨论】:

    • 我已经按照你们的建议做了,代码编译没有任何错误。但是触发器似乎没有在我尝试将其插入的表上添加任何数据。
    • 我们无法远程调试您的环境。所以你需要为我们提供一个可重现的测试用例。
    • 可重现的测试用例?你是什​​么意思?
    • 发布表结构和显示问题的示例数据
    猜你喜欢
    • 2014-06-19
    • 2014-01-04
    • 1970-01-01
    • 2018-09-14
    • 2016-10-16
    • 2016-03-21
    • 2020-04-24
    • 1970-01-01
    • 2019-12-23
    相关资源
    最近更新 更多