簡體   English   中英

我的觸發器有問題我 sql Oracle

[英]I have a problem with triggers i sql Oracle

(zaposlenik 表示雇員,godisnji_odmor 表示假期)所以我想創建一個觸發器,如果員工(這里稱為 zaposlenik)在 2020 年插入后有超過 21 天的假期,則觸發該觸發器。員工可以有多個假期(比如 2天,10 天......)表 zaposlenik(員工)和 godisnji_odmor(假期)之間的一對多關系。 我的問題是我不知道如何從觸發器觸發的插入中獲取該 zaposlenik_id,因此我可以在 ID = zaposlenik_id 上總結該員工的休假天數。

這是我的表格和觸發器。

CREATE TABLE zaposlenik  
(
    zaposlenik_id INTEGER CONSTRAINT zaposlenik_pk PRIMARY KEY,
    posao VARCHAR(30) NOT NULL,
    ime VARCHAR(30) NOT NULL,
    prezime VARCHAR(30) NOT NULL,
    broj_tel INTEGER NOT NULL,
    email VARCHAR(50) NOT NULL,
    adresa VARCHAR(100) NOT NULL,
    mjesecni_iznos_place FLOAT NOT NULL,
    IBAN VARCHAR(34) NOT NULL,
    budzet FLOAT,
    parking_mjesto_id VARCHAR(5) CONSTRAINT zaposlenik_parking_mjesto_fk REFERENCES
        parking_mjesto(etaza_i_br_mjesta),

    zaposlenik_id_2 INTEGER CONSTRAINT zaposlenik_zaposlenik_fk REFERENCES 
        zaposlenik(zaposlenik_id)
);
CREATE TABLE godisnji_odmor
(
    godisnji_odmor_id INTEGER CONSTRAINT godisnji_odmor_pk PRIMARY KEY,
    pocetak DATE NOT NULL,
    kraj DATE NOT NULL,
    zaposlenik_id INTEGER NOT NULL CONSTRAINT godisnji_odmor_zaposlenik_fk REFERENCES
        zaposlenik(zaposlenik_id)
);
CREATE OR REPLACE TRIGGER t_godisnji
    AFTER INSERT
    ON godisnji_odmor
DECLARE
    v_br NUMBER; --sum of the vacation days
    v_id NUMBER; -- id of the employee that is inserted (his id is zaposlenik_id)
BEGIN
    SELECT zaposlenik_id INTO v_id FROM INSERTED;

    SELECT SUM( g.kraj - g.pocetak ) INTO v_br 
    FROM zaposlenik z INNER JOIN godisnji_odmor g USING(zaposlenik_id)
    WHERE g.pocetak > '01-JANUARY-2020' AND zaposlenik_id = v_id;

    IF v_br > 21 THEN
        ROLLBACK;
        raise_application_error(-20100,'Godisnji prekoracuje 21 dan u sumi');
    END IF;
END t_godisnji;
/

您需要為此使用:new ,如下所示:

代替

SELECT zaposlenik_id INTO v_id FROM INSERTED;

v_id := :new.zaposlenik_id; 

簡而言之,您可以讓您的代碼沒有 v_id 變量,如下所示:

CREATE OR REPLACE TRIGGER t_godisnji
    AFTER INSERT
    ON godisnji_odmor
DECLARE
    v_br NUMBER; --sum of the vacation days
    --v_id NUMBER; -- id of the employee that is inserted (his id is zaposlenik_id)
BEGIN
    --SELECT zaposlenik_id INTO v_id FROM INSERTED;

    SELECT SUM( g.kraj - g.pocetak ) INTO v_br 
    FROM zaposlenik z INNER JOIN godisnji_odmor g USING(zaposlenik_id)
    WHERE g.pocetak > '01-JANUARY-2020' 
      AND zaposlenik_id = :new.zaposlenik_id; -- see the usage of :new here

    IF v_br > 21 THEN
        ROLLBACK;
        raise_application_error(-20100,'Godisnji prekoracuje 21 dan u sumi');
    END IF;
END t_godisnji;
/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM