如何创建Oracle触发器 插入时基于createddate自动生成序列ID
实现方案
你需要的插入时自动填充序列逻辑,用Oracle的BEFORE INSERT行级触发器即可实现,不需要额外开发复杂逻辑:createddate是DATE类型,本身存储了完整的年月日时分秒信息,直接按要求格式转换赋值即可。
触发器代码
直接执行如下语句创建触发器:
CREATE OR REPLACE TRIGGER trg_upload_gen_seq BEFORE INSERT ON upload FOR EACH ROW BEGIN -- 将传入的createddate格式化为YYYYMMDD_HHMMSS格式,赋值给getsequence字段 :NEW.getsequence := TO_CHAR(:NEW.createddate, 'YYYYMMDD_HH24MISS'); END; /
创建完成后,你通过Oracle APEX表单仅插入前4列数据时,数据库会在插入动作执行前自动生成对应格式的序列值填充到getsequence字段,完全匹配你的业务要求。
补充说明
- 你贴出的原始建表语句存在语法疏漏,缺少
TABLE关键字,正确建表语句参考:
CREATE TABLE upload ( fileblob blob, mimetype varchar2(4000 char), filename varchar2(4000 char), createddate date, getsequence varchar2(4000 char) );
- 格式化模板中使用
HH24是为了按24小时制输出小时值,避免下午时间被转换为12小时制导致格式错位,最终输出的时间部分固定为6位数字,和你给出的预期样例格式完全一致。 - 如果需要给表中已有的存量历史数据补全
getsequence字段,执行如下更新语句即可:
UPDATE upload SET getsequence = TO_CHAR(createddate, 'YYYYMMDD_HH24MISS') WHERE getsequence IS NULL; COMMIT;
- 注意如果同一秒内插入多条记录,当前生成逻辑会产生重复值,如果业务要求
getsequence全局唯一,可以在格式化后的时间字符串后拼接一个独立Oracle序列值做区分;按你给出的预期样例判断,当前逻辑已经满足需求。
内容的提问来源于stack exchange,提问作者kiric8494
相关产品推荐
相关产品推荐

