警告:创建的触发器存在编译错误,SQL 语句被忽略且关系运算符无效

Warning : Trigger created with compilation errors, SQL Statement ignored and invalid relational operator

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

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

这是我的数据库的代码table

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;

首先,:<=:>= 不是有效的 Oracle 语法。

:= 在查询内部使用时也是无效的。它在某些其他情况下有效,例如为变量赋值,例如:this_var := 5;

其次,根据 Oracle 文档:

To reference a pseudorecord, put a colon before its name—:OLD or :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;