Oracle Live SQL创建AFTER UPDATE触发器更新不满20岁用户DOB问题
Oracle AFTER UPDATE触发器需求实现方案
需求说明
在Oracle Live SQL环境中开发,针对SYCS_DBMS表创建触发器:当表中记录的年龄小于20岁时,自动更新其出生日期(DOB),确保修改后的记录年龄≥20岁。
现有代码问题
你当前编写的代码存在以下可优化/错误点:
- 触发器类型选择错误:
AFTER UPDATE触发器触发时,行数据已经完成写入操作,无法修改:NEW伪记录的字段值,需要改为BEFORE UPDATE触发器 - 冗余类型转换:
SYSDATE和:NEW.DOB本身就是DATE类型,不需要额外使用TO_DATE()转换,多余转换可能触发格式匹配错误 - 缺失核心逻辑:缺少年龄小于20岁时的DOB更新逻辑
完整可运行代码
1. 建表&插入测试数据(原有逻辑可直接复用)
create table SYCS_DBMS( SID NUMBER(10), SNAME VARCHAR(50), DOB DATE, PRESENT DATE ); ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; INSERT INTO SYCS_DBMS VALUES(1, 'ANKIT', '4-OCTOBER-2002', sysdate); INSERT INTO SYCS_DBMS VALUES(2, 'AAKASH', '30-OCTOBER-2002', sysdate); INSERT INTO SYCS_DBMS VALUES(3, 'DHRUV', '5-APRIL-2002', sysdate); INSERT INTO SYCS_DBMS VALUES(4, 'DEERAJ', '5-AUGUST-2002', sysdate); INSERT INTO SYCS_DBMS VALUES(5, 'ADIL', '11-MARCH-2003', sysdate); INSERT INTO SYCS_DBMS VALUES(6, 'VIRAJ', '7-JULY-2002', sysdate);
2. 修正后的触发器代码
CREATE OR REPLACE TRIGGER trUPDT BEFORE UPDATE ON SYCS_DBMS FOR EACH ROW DECLARE STU_AGE NUMBER; BEGIN -- 计算当前年龄 STU_AGE := MONTHS_BETWEEN(SYSDATE, :NEW.DOB)/12; -- 年龄小于20时自动调整DOB为当前日期往前推20年零1天,保证年龄≥20 IF STU_AGE < 20 THEN :NEW.DOB := ADD_MONTHS(SYSDATE, -12*20) -1; END IF; END; /
测试方法
执行以下更新语句测试触发器效果,更新后查询对应记录的DOB会自动调整为满足年龄≥20的值:
-- 把ADIL的DOB改为2010年,年龄显然小于20,会触发自动修正 UPDATE SYCS_DBMS SET DOB = '10-OCT-2010' WHERE SID =5; -- 查询验证结果 SELECT SID, SNAME, DOB, MONTHS_BETWEEN(SYSDATE, DOB)/12 AS AGE FROM SYCS_DBMS WHERE SID=5;
内容的提问来源于stack exchange,提问作者user16454187
相关产品推荐
相关产品推荐

