Oracle 如何修复触发器错误?甲骨文19快车

Oracle 如何修复触发器错误?甲骨文19快车,oracle,triggers,apex,audit,Oracle,Triggers,Apex,Audit,我想跟踪某个表的用户活动。 为此,我创建了一个表,可以在其中插入审计数据: CREATE TABLE "AUDIT_FINALPAPERS" ( "TBLID" NUMBER, "NAME" VARCHAR2(10), "REMARKS" VARCHAR2(255), "AUDIT_USER" VARCHAR2(50), "AUDI

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

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\u trg\u aKtion
(而不是
aCtion

看一看,;触发器已创建

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>

我不知道你这是什么意思。我创建了AUDIT_TBL1(正如您所发布的)和-以便使触发器编译-TBL1,其中包含必要的列。不过,我建议您删除任何可能要创建的Oracle对象周围的双引号。已经删除了双引号。
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>