【问题标题】:Error raised while creating the trigger in oracle apex在 oracle apex 中创建触发器时引发错误
【发布时间】:2021-02-22 14:41:00
【问题描述】:

编译失败,第 3 行 (14:38:54) 与编译错误相关的行号与第一个 BEGIN 语句相关。这只会影响数据库触发器的编译。 PLS-00382:表达式类型错误编译失败,第 3 行 (14:38:54) 与编译错误相关的行号与第一个 BEGIN 语句相关。这只会影响数据库触发器的编译。 PL/SQL:语句被忽略

CREATE TABLE  "P1_EXAM_TIMETABLE" 
   (    "EXAM_ID" NUMBER(7,0), 
    "SCH_NO" NUMBER(4,0), 
    "CLASS_CODE" VARCHAR2(3) COLLATE "USING_NLS_COMP", 
    "EXAM_NAME" VARCHAR2(11) COLLATE "USING_NLS_COMP", 
    "MAX_MARKS" NUMBER(3,0), 
    "EXAM_DATE" DATE, 
    "SCH_SESSION" VARCHAR2(7) COLLATE "USING_NLS_COMP", 
    "SUBJECT" VARCHAR2(20) COLLATE "USING_NLS_COMP", 
    "CREATED_BY" VARCHAR2(30) COLLATE "USING_NLS_COMP", 
    "CREATED_ON" NUMBER, 
    "UPDATED_BY" VARCHAR2(30) COLLATE "USING_NLS_COMP", 
    "UPDATED_ON" NUMBER, 
     CONSTRAINT "P1_EXAM_TIMETABLE_PK" PRIMARY KEY ("EXAM_ID")
  USING INDEX  ENABLE
   )  DEFAULT COLLATION "USING_NLS_COMP"
/

CREATE OR REPLACE TRIGGER  BI_P1_EXAM_TIMETABLE BEFORE
INSERT ON P1_EXAM_TIMETABLE
FOR EACH ROW  
BEGIN   
    :new.EXAM_ID:= P1_EXAM_TIMETABLE_SEQ.nextval; 
    :new.CREATED_ON:= SYSDATE; 
    :new.CREATED_BY:= nvl(v('APP_USER'), 'SYSTEM'); 
    :new.UPDATED_BY:= NULL; 
    :new.UPDATED_ON:= NULL;
END;

有谁知道我在哪里失踪,请帮我解决这个问题

【问题讨论】:

  • 可以发一下表结构吗?该错误表明您有类型问题。另外,v('APP_USER') 是什么?
  • 我创建了相同的触发器,但这不起作用我怀疑它为什么不起作用
  • 不知道表很难帮你

标签: oracle plsql triggers


【解决方案1】:

当然,这行不通。这就是你正在做的:

表:

"CREATED_ON" NUMBER,                 --> number datatype

触发器:

:new.CREATED_ON:= SYSDATE;          --> SYSDATE is a function that returns DATE datatype

您不能将日期放入数字数据类型。该怎么办?修复列数据类型并将其更改为DATE


SQL> create table p1_exam_timetable(
  2    exam_id      number(7,0),
  3    sch_no       number(4,0),
  4    class_code   varchar2(3),
  5    exam_name    varchar2(11),
  6    max_marks    number(3,0),
  7    exam_date    date,
  8    sch_session  varchar2(7),
  9    subject      varchar2(20),
 10    created_by   varchar2(30),
 11    created_on   date,              --> Here! Was NUMBER
 12    updated_by   varchar2(30),
 13    updated_on   number,
 14    constraint p1_exam_timetable_pk primary key(exam_id)
 15      using index enable
 16  )
 17  /

Table created.

SQL> create sequence p1_exam_timetable_seq;

Sequence created.

触发器:

SQL> create or replace trigger bi_p1_exam_timetable before
  2    insert on p1_exam_timetable
  3    for each row
  4  begin
  5    :new.exam_id    := p1_exam_timetable_seq.nextval;
  6    :new.created_on := sysdate;
  7    :new.created_by := nvl(v('APP_USER'), 'SYSTEM');
  8    :new.updated_by := null;
  9    :new.updated_on := null;
 10  end;
 11  /

Trigger created.

测试:

SQL> insert into p1_exam_timetable (exam_id) values (1);

1 row created.

SQL> select * from p1_exam_timetable;

   EXAM_ID     SCH_NO CLA EXAM_NAME    MAX_MARKS EXAM_DATE  SCH_SES
---------- ---------- --- ----------- ---------- ---------- -------
SUBJECT              CREATED_BY                     CREATED_ON
-------------------- ------------------------------ ----------
UPDATED_BY                     UPDATED_ON
------------------------------ ----------
         1
                     SYSTEM                         22.02.2021



SQL>

附:使用 Oracle 时,不要使用双引号,它们只会导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2013-12-24
    • 2018-02-07
    • 1970-01-01
    • 2018-12-18
    • 2013-03-26
    相关资源
    最近更新 更多