【问题标题】:Warning : Trigger created with compilation errors, SQL Statement ignored and invalid relational operator警告:创建触发器时出现编译错误、忽略 SQL 语句和无效的关系运算符
【发布时间】:2020-03-28 08:09:23
【问题描述】:

我想使用触发器限制表上的输入,但我总是收到错误消息。 警告:创建的触发器存在编译错误。

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/1      PL/SQL: SQL Statement ignored
4/67     PL/SQL: ORA-00920: invalid relational operator

这是我的数据库表的代码

CREATE TABLE jadwal(
    id_jadwal VARCHAR2(10) NOT NULL,
    hari VARCHAR2(7) NOT NULL,
    jam_masuk TIME,
    jam_keluar TIME,
    id_ajar VARCHAR2(20) NOT NULL,
    id_ruang VARCHAR2(4) NOT NULL,
    CONSTRAINT pk_jadwal PRIMARY KEY(id_jadwal),
    CONSTRAINT fk_ajar_jadwal FOREIGN KEY(id_ajar) REFERENCES
    ajar(id_ajar) ON DELETE CASCADE,
    CONSTRAINT fk_ruangan_jadwal FOREIGN KEY(id_ruang) REFERENCES
    ruangan(id_ruang) ON DELETE CASCADE
);

这是我的触发器的代码

CREATE OR REPLACE TRIGGER bef_ins_or_upd_jadwal
BEFORE INSERT OR UPDATE ON jadwal
FOR EACH ROW
DECLARE
    v_cek number(1);
BEGIN
    SELECT COUNT(id_jadwal) INTO v_cek FROM jadwal WHERE old.id_ruang := new.id_ruang AND old.hari := new.hari AND old.jam_masuk :<= new.jam_masuk AND old.jam_keluar :>= new.jam_masuk AND old.id_ajar := new.id_ajar
    OR
    old.id_ruang := new.id_ruang AND old.hari := new.hari AND old.jam_masuk :<= new.jam_keluar AND old.jam_keluar :>= new.jam_keluar AND old.id_ajar := new.id_ajar
    OR
    old.id_ruang := new.id_ruang AND old.hari := new.hari AND old.jam_masuk :>= new.jam_masuk AND old.jam_keluar :<= new.jam_keluar AND old.id_ajar := new.id_ajar;

    if v_cek > 0 THEN
        dbms_output.put_line('id_ruang Sudah Di Isi');
    ELSE
        dbms_output.put_line('berhasil');
    END IF;
END;

【问题讨论】:

  • :&gt;=:&lt;= 怎么了?
  • 我用它来定义大于或等于
  • 这不是有效的 Oracle 语法。使用&gt;=&lt;=
  • 我用过,结果一样

标签: oracle plsql oracle11g database-trigger


【解决方案1】:

首先,:&lt;=:&gt;= 不是有效的 Oracle 语法。

:= 在查询中使用时也是无效的。它在其他一些情况下也是有效的,比如给变量赋值:this_var := 5;

其次,根据Oracle文档:

要引用伪记录,请在其名称前加一个冒号——:OLD 或 :NEW

这意味着如果你想访问比如说old.id_ruang,你应该像这样访问它::old.id_ruang

说了这么多,代码应该是这样的:

CREATE OR REPLACE TRIGGER bef_ins_or_upd_jadwal
BEFORE INSERT OR UPDATE ON jadwal
FOR EACH ROW
DECLARE
    v_cek number(1);
BEGIN
    SELECT COUNT(id_jadwal) INTO v_cek FROM jadwal WHERE :old.id_ruang = :new.id_ruang AND :old.hari = :new.hari AND :old.jam_masuk <= :new.jam_masuk AND :old.jam_keluar >= :new.jam_masuk AND :old.id_ajar = :new.id_ajar
    OR
    :old.id_ruang = :new.id_ruang AND :old.hari = :new.hari AND :old.jam_masuk <= :new.jam_keluar AND :old.jam_keluar >= :new.jam_keluar AND :old.id_ajar = :new.id_ajar
    OR
    :old.id_ruang = :new.id_ruang AND :old.hari = :new.hari AND :old.jam_masuk >= :new.jam_masuk AND :old.jam_keluar <= :new.jam_keluar AND :old.id_ajar = :new.id_ajar;

    IF v_cek > 0 THEN
        dbms_output.put_line('id_ruang Sudah Di Isi');
    ELSE
        dbms_output.put_line('berhasil');
    END IF;
END;

【讨论】:

  • 非常感谢,我猜 (:) 放在运算符前面。我必须大量阅读并了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多