我在使用sql oracle时遇到了触发器问题

fwzugrvs  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(472)

(zaposlenik的意思是emplopoyee,godisnji_odmor的意思是假期)所以我想做一个触发器,如果一个雇员(这里称为zaposlenik)在2020年插入后有超过21天的假期,那么它就会触发。一个员工可以有多个假期(比如2天,10天…)表zaposlenik(员工)和godisnjièodmor(假期)之间的一对多关系。我的问题是,我不知道如何从触发器触发的插入中获取zaposlenik\u id,这样我就可以在id=zaposlenik\u id上总结该员工的休假天数。
这是我的table和扳机。

  1. CREATE TABLE zaposlenik
  2. (
  3. zaposlenik_id INTEGER CONSTRAINT zaposlenik_pk PRIMARY KEY,
  4. posao VARCHAR(30) NOT NULL,
  5. ime VARCHAR(30) NOT NULL,
  6. prezime VARCHAR(30) NOT NULL,
  7. broj_tel INTEGER NOT NULL,
  8. email VARCHAR(50) NOT NULL,
  9. adresa VARCHAR(100) NOT NULL,
  10. mjesecni_iznos_place FLOAT NOT NULL,
  11. IBAN VARCHAR(34) NOT NULL,
  12. budzet FLOAT,
  13. parking_mjesto_id VARCHAR(5) CONSTRAINT zaposlenik_parking_mjesto_fk REFERENCES
  14. parking_mjesto(etaza_i_br_mjesta),
  15. zaposlenik_id_2 INTEGER CONSTRAINT zaposlenik_zaposlenik_fk REFERENCES
  16. zaposlenik(zaposlenik_id)
  17. );
  1. CREATE TABLE godisnji_odmor
  2. (
  3. godisnji_odmor_id INTEGER CONSTRAINT godisnji_odmor_pk PRIMARY KEY,
  4. pocetak DATE NOT NULL,
  5. kraj DATE NOT NULL,
  6. zaposlenik_id INTEGER NOT NULL CONSTRAINT godisnji_odmor_zaposlenik_fk REFERENCES
  7. zaposlenik(zaposlenik_id)
  8. );
  1. CREATE OR REPLACE TRIGGER t_godisnji
  2. AFTER INSERT
  3. ON godisnji_odmor
  4. DECLARE
  5. v_br NUMBER; --sum of the vacation days
  6. v_id NUMBER; -- id of the employee that is inserted (his id is zaposlenik_id)
  7. BEGIN
  8. SELECT zaposlenik_id INTO v_id FROM INSERTED;
  9. SELECT SUM( g.kraj - g.pocetak ) INTO v_br
  10. FROM zaposlenik z INNER JOIN godisnji_odmor g USING(zaposlenik_id)
  11. WHERE g.pocetak > '01-JANUARY-2020' AND zaposlenik_id = v_id;
  12. IF v_br > 21 THEN
  13. ROLLBACK;
  14. raise_application_error(-20100,'Godisnji prekoracuje 21 dan u sumi');
  15. END IF;
  16. END t_godisnji;
  17. /
drkbr07n

drkbr07n1#

你需要使用 :new 具体如下:
替换

  1. SELECT zaposlenik_id INTO v_id FROM INSERTED;

  1. v_id := :new.zaposlenik_id;

简言之,您的代码可以不带v\u id变量,如下所示:

  1. CREATE OR REPLACE TRIGGER t_godisnji
  2. AFTER INSERT
  3. ON godisnji_odmor
  4. DECLARE
  5. v_br NUMBER; --sum of the vacation days
  6. --v_id NUMBER; -- id of the employee that is inserted (his id is zaposlenik_id)
  7. BEGIN
  8. --SELECT zaposlenik_id INTO v_id FROM INSERTED;
  9. SELECT SUM( g.kraj - g.pocetak ) INTO v_br
  10. FROM zaposlenik z INNER JOIN godisnji_odmor g USING(zaposlenik_id)
  11. WHERE g.pocetak > '01-JANUARY-2020'
  12. AND zaposlenik_id = :new.zaposlenik_id; -- see the usage of :new here
  13. IF v_br > 21 THEN
  14. ROLLBACK;
  15. raise_application_error(-20100,'Godisnji prekoracuje 21 dan u sumi');
  16. END IF;
  17. END t_godisnji;
  18. /
展开查看全部

相关问题