DECLARE v_yclfmx number; v_wgclfmx number; if :new.jgbspsj != :old.jgbspsj then select sum(hj) into v_yclfmx from uf_jxjgshgcb_dt14 where mainid = :old.id; update uf_jxjgshgcb set jgbyclf = v_yclfmx where id=:old.id; select sum(hj) into v_wgclfmx from uf_jxjgshgcb_dt16 where mainid = :old.id; update uf_jxjgshgcb set jgbwgclf = v_wgclfmx where id=:old.id; end IF;
时间: 2024-04-05 20:32:33 浏览: 13
这段代码是一个 PL/SQL 的触发器,当一个数据行被修改(UPDATE)时,会检查其 jgbspsj 字段的值是否被改变。如果改变了,则会执行两个 SELECT 语句来计算该数据行对应的两个子表中 hj 字段的总和,并分别更新主表 uf_jxjgshgcb 中的 jgbyclf 和 jgbwgclf 字段的值为这两个总和。否则,不执行任何操作。
相关问题
这是我的代码,该如何修改CREATE TRIGGER tr_lineitem_quantity_update AFTER UPDATE ON lineitem FOR EACH ROW BEGIN DECLARE p_retailprice DOUBLE; SELECT retailprice INTO p_retailprice FROM part WHERE partkey = NEW.partkey; IF (NEW.quantity != OLD.quantity) THEN UPDATE lineitem AS l SET l.extendedprice = p_retailprice * NEW.quantity * NEW.discount WHERE l.orderkey = NEW.orderkey AND l.linenumber = NEW.linenumber; UPDATE partsupp AS p SET p.availqty = p.availqty - (NEW.quantity - OLD.quantity) WHERE p.partkey = NEW.partkey AND p.suppkey = NEW.suppkey; END IF; END;
这段代码是一个在lineitem表中添加触发器的SQL语句,目的是在lineitem表中的数据被更新时,自动更新extendedprice和partsupp表中的availqty字段。
修改建议:
1. 建议添加错误处理机制,例如使用SIGNAL语句抛出异常;
2. 建议添加事务处理机制,例如使用START TRANSACTION和COMMIT语句;
3. 建议对代码进行优化,例如使用JOIN语句代替多个UPDATE语句。
下面是修改后的代码:
DELIMITER //
CREATE TRIGGER tr_lineitem_quantity_update
AFTER UPDATE ON lineitem
FOR EACH ROW
BEGIN
DECLARE p_retailprice DOUBLE;
DECLARE old_quantity INT;
DECLARE new_quantity INT;
SELECT retailprice INTO p_retailprice FROM part WHERE partkey = NEW.partkey;
IF (NEW.quantity != OLD.quantity) THEN
START TRANSACTION;
SET old_quantity = OLD.quantity;
SET new_quantity = NEW.quantity;
UPDATE lineitem AS l
INNER JOIN partsupp AS p ON l.partkey = p.partkey AND l.suppkey = p.suppkey
SET l.extendedprice = p_retailprice * new_quantity * NEW.discount,
p.availqty = p.availqty - (new_quantity - old_quantity)
WHERE l.orderkey = NEW.orderkey AND l.linenumber = NEW.linenumber;
IF (ROW_COUNT() = 0) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Update failed';
END IF;
COMMIT;
END IF;
END //
DELIMITER ;
-- 這是一個觸發器的基本結構 CREATE OR REPLACE TRIGGER XU_YANG.avg_sal AFTER INSERT OR UPDATE OF sal ON YX_EMP -- AFTER 表示執行時間,只有在 INSERT OR UPDATE 才會觸發這個 FOR EACH ROW -- 表示該觸發器會對每一行進行處理 BEGIN -- 计算薪资 DECLARE v_comm NUMBER(7,2); v_dsal NUMBER(7,2); v_socialsecurity NUMBER(7,2); v_avgsal NUMBER(10,2); BEGIN -- 计算提成 IF :NEW.sal > 10000 THEN v_comm := :NEW.sal * 0.1; ELSE v_comm := 0; END IF; -- 计算扣款 v_dsal := :NEW.sal * 0.05; -- 计算社保 v_socialsecurity := :NEW.sal * 0.1; -- 计算总工资和平均工资 v_avgsal := :NEW.sal + v_comm - v_dsal - v_socialsecurity; -- 将计算结果写入SAL薪资表中 INSERT INTO YX_SAL(EMPNO, COMM, SAL, DSAL, SOCIALSECURITY, AVGSAL) VALUES(:NEW.empno, v_comm, :NEW.sal, v_dsal, v_socialsecurity, v_avgsal); END; END;
这是一个 Oracle 数据库中的触发器,触发器的名称是 XU_YANG.avg_sal,它是在 YX_EMP 表上进行 INSERT 或 UPDATE 操作后执行的。对于每一行数据的变化,都会执行 BEGIN 和 END 之间的语句。在 BEGIN 和 END 之间的语句中,首先声明了一些变量,接着通过一些计算得到了员工的总工资和平均工资,最后将这些计算结果写入了 SAL 薪资表中。该触发器的作用是对员工薪资进行计算,并将计算结果写入 SAL 表中。