微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复触发器错误? Oracle 19 Express

如何解决如何修复触发器错误? Oracle 19 Express

我想跟踪某个表的用户活动。 为此,我创建了一个表,我可以在其中插入审计数据:

CREATE TABLE  "AUDIT_FINALPAPERS" 
   (    "TBLID" NUMBER,"NAME" VARCHAR2(10),"REMARKS" VARCHAR2(255),"AUDIT_USER" VARCHAR2(50),"AUDIT_DATE" DATE,"AUDIT_ACTION" VARCHAR2(30)
   )

然后创建了一个触发器来跟踪用户活动并将数据插入到审计表中:

     CREATE OR REPLACE TRIGGER AUDIT_TBL1
  2     -- starts on every update,insert or delete command
  3     AFTER INSERT OR DELETE OR UPDATE
  4     ON TBL1
  5     FOR EACH ROW
  6  DECLARE
  7     -- variable which declares if update,delete or insert process
  8     v_trg_action  VARCHAR2 (30);
  9     v_user        VARCHAR2 (30);
 10  BEGIN
 11     v_user := SYS_CONTEXT ('APEX$SESSION','APP_USER');
 12
 13     IF UPDATING
 14     THEN
 15        -- when update
 16        v_trg_action := 'UPDATED.';
 17     ELSIF DELETING
 18     THEN
 19        -- when delete
 20        v_trg_action := 'DELETED.';
 21     ELSIF INSERTING
 22     THEN
 23        -- when insert
 24        v_trg_action := 'SUBMITTED.';      -- aKtion
 25     ELSE
 26        -- if something else
 27        v_trg_action := NULL;
 28     END IF;
 29
 30     IF v_trg_action IN ('DELETED.','UPDATED.')
 31     THEN
 32        -- if v_trg_action is DELETE or UPDATE then insert old table values
 33        INSERT INTO AUDIT_TBL1 (TBLID,34                                NAME,35                                REMARKS,36                                AUDIT_USER,37                                AUDIT_DATE,38                                AUDIT_ACTION)
 39             VALUES (:OLD.TBLID,40                     :OLD.NAME,41                     :OLD.REMARKS,42                     v_user,43                     SYSDATE,44                     v_trg_action);
 45     ELSE
 46        INSERT INTO AUDIT_TBL1 (TBLID,47                                NAME,48                                REMARKS,49                                AUDIT_USER,50                                AUDIT_DATE,51                                AUDIT_ACTION)
 52             VALUES (:NEW.TBLID,53                     :NEW.NAME,54                     :NEW.REMARKS,55                     v_user,56                     SYSDATE,57                     v_trg_action);
 58     END IF;
 59  -- about the insert command on the audit table
 60  -- for current apex user:SYS_CONTEXT('APEX$SESSION','APP_USER');
 61  -- for date: SYSDATE
 62  -- for sql command: v_trg_action
 63  END AUDIT_TBL1;
 64  /

但是我收到错误:PLS-00049:绑定变量错误 这究竟是什么意思,如何解决

解决方法

看起来像一个错误报告的错误。当我运行您的代码时,它运行良好除了这部分,因为您将变量命名为 v_trg_aKtion(而不是 aCtion

 21     ELSIF INSERTING
 22     THEN
 23        -- when insert
 24        v_trg_action := 'SUBMITTED.';      -- aKtion

看看;触发器已创建。

SQL> CREATE OR REPLACE TRIGGER AUDIT_TBL1
  2     -- starts on every update,insert or delete command
  3     AFTER INSERT OR DELETE OR UPDATE
  4     ON TBL1
  5     FOR EACH ROW
  6  DECLARE
  7     -- variable which declares if update,delete or insert process
  8     v_trg_action  VARCHAR2 (30);
  9     v_user        VARCHAR2 (30);
 10  BEGIN
 11     v_user := SYS_CONTEXT ('APEX$SESSION','APP_USER');
 12
 13     IF UPDATING
 14     THEN
 15        -- when update
 16        v_trg_action := 'UPDATED.';
 17     ELSIF DELETING
 18     THEN
 19        -- when delete
 20        v_trg_action := 'DELETED.';
 21     ELSIF INSERTING
 22     THEN
 23        -- when insert
 24        v_trg_action := 'SUBMITTED.';      -- aKtion
 25     ELSE
 26        -- if something else
 27        v_trg_action := NULL;
 28     END IF;
 29
 30     IF v_trg_action IN ('DELETED.','UPDATED.')
 31     THEN
 32        -- if v_trg_action is DELETE or UPDATE then insert old table values
 33        INSERT INTO AUDIT_TBL1 (TBLID,34                                NAME,35                                REMARKS,36                                AUDIT_USER,37                                AUDIT_DATE,38                                AUDIT_ACTION)
 39             VALUES (:OLD.TBLID,40                     :OLD.NAME,41                     :OLD.REMARKS,42                     v_user,43                     SYSDATE,44                     v_trg_action);
 45     ELSE
 46        INSERT INTO AUDIT_TBL1 (TBLID,47                                NAME,48                                REMARKS,49                                AUDIT_USER,50                                AUDIT_DATE,51                                AUDIT_ACTION)
 52             VALUES (:NEW.TBLID,53                     :NEW.NAME,54                     :NEW.REMARKS,55                     v_user,56                     SYSDATE,57                     v_trg_action);
 58     END IF;
 59  -- about the insert command on the audit table
 60  -- for current apex user:SYS_CONTEXT('APEX$SESSION','APP_USER');
 61  -- for date: SYSDATE
 62  -- for sql command: v_trg_action
 63  END AUDIT_TBL1;
 64  /

Trigger created.

SQL>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。