【发布时间】:2019-07-28 00:59:17
【问题描述】:
问题: 需要表 A 的触发器,它执行以下操作: 每次在 TRT_PROCEDURE 列的表 A 中插入一个 INSERT 值,加 1 到表 B 中的列“TRT_INS_COUNT”。如果 TRT_PROCEDURE 值确实 B表中不存在,在B表中添加一行,用于程序设置 TRT_INS_COUNT 为 1。
每次对表 A 进行 DELETE 操作时,将表 A 中的 TRT_DEL_COUNT 列加 1 如果该过程值存在于表 B 中,则表 B 为该过程值。如果它不存在 存在于表 B 中,为过程在表 B 中添加一行并设置 TRT_DEL_COUNT 改为 1。
表 A 中的 TRT_PROCEDURE 列每次发生 UPDATE 时,将 1 添加到 表 B 中的 TRT_UPD_COUNT 列。如果不在表 B 中,则添加一行 表 B 的过程值并将 TRT_UPD_COUNT 设置为 1。如果 Column 表 A 中的 TRT_PROCEDURE 值已更改,将 TRT_UPD_COUNT 加 1 旧程序值。
通过执行多次 INSERT、DELETE 和 UPDATE 进行测试,然后显示表 B。
更新:每当将 trt_procedure 的值插入到表 B 中时,第二个相同的 trt_procedure(例如“88-20”)无法正确计入其指定的计数字段。不知道哪里出错了。
TABLE A
Name Null Type
TRT_ID NOT NULL NUMBER(3)
PAT_NBR NUMBER(4)
PHYS_ID NUMBER(3)
TRT_PROCEDURE VARCHAR2(5)
TRT_DATE DATE
TABLE B
Name Null Type
TRT_PROCEDURE NOT NULL VARCHAR2(5)
TRT_INS_COUNT NUMBER(3)
TRT_DEL_COUNT NUMBER(3)
TRT_UPD_COUNT NUMBER(3)
TEST SAMPLES
INSERT INTO A VALUES (11, 8031,101,'88-20',sysdate );
INSERT INTO A VALUES (12, 5872,101,'60-00',sysdate );
UPDATE A SET trt_procedure = '88-20' WHERE trt_id=6;
/*row trt_id =6 cloumn trt_procedure old value '54-60'
new value '88-20', which means Table B row '88-20' and
row '54-60 both trt_upd_count should add 1*/
DELETE FROM A WHERE trt_id=1;
/*row trt_id =1 cloumn trt_procedure value also '88-20', which means
that Table B row '88-20' trt_del_count should also add 1*/
CREATE OR REPLACE TRIGGER trt_stats_trg
BEFORE INSERT OR UPDATE OR DELETE OF TRT_procedure ON A FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE B SET trt_ins_count = trt_ins_count+1
WHERE B.trt_procedure = :new.trt_procedure;
IF SQL%NOTFOUND THEN
INSERT INTO B (trt_procedure, trt_ins_count)
VALUES (:new.trt_procedure, 1);
END IF;
ELSIF UPDATING THEN
UPDATE B SET trt_upd_count = trt_upd_count+1
WHERE B.trt_procedure = :old.trt_procedure;
IF SQL%NOTFOUND THEN
INSERT INTO B (trt_procedure, trt_upd_count)
VALUES (:old.trt_procedure, 1);
END IF;
UPDATE B SET trt_upd_count = trt_upd_count+1
WHERE B.trt_procedure = :new.trt_procedure;
IF SQL%NOTFOUND THEN
INSERT INTO B (trt_procedure, trt_upd_count)
VALUES (:new.trt_procedure, 1);
END IF;
ELSIF DELETING THEN
UPDATE B SET trt_del_count = trt_del_count+1
WHERE B.trt_procedure = :old.trt_procedure;
IF SQL%NOTFOUND THEN
INSERT INTO B (trt_procedure, trt_del_count)
VALUES (:old.trt_procedure, 1);
END IF;
END IF;
END trt_stats_trg;
【问题讨论】:
标签: oracle plsql database-trigger