Oracle中如何创建INSERT时从TNAME生成TID的触发器?
实现根据TNAME自动生成TID的方案
嘿,针对你这个根据TNAME自动生成TID的需求,我来给你捋捋怎么在Oracle里实现哈~
首先先明确咱们的规则:
- 当
TNAME是单个单词时:取该单词的前4个字符(如果单词长度不够4,就取全部字符) - 当
TNAME包含多个单词时:每个单词分别取前2个字符,再拼接成最终的TID(比如你给的示例Sports Bike,按规则应该生成SpBi,如果实际需要的是首字母拼接的SB,后面我会说怎么调整)
最靠谱的实现方式是用Oracle的前置触发器,在插入数据前自动计算并填充TID字段,代码如下:
CREATE OR REPLACE TRIGGER trg_test1_generate_tid BEFORE INSERT ON test1 FOR EACH ROW DECLARE v_words DBMS_OUTPUT.LINEAR_ARRAY; -- 用来存拆分后的各个单词 v_word_count NUMBER; v_tid VARCHAR2(100); BEGIN -- 把TNAME按空格拆分成单词列表 v_words := DBMS_UTILITY.COMMA_TO_TABLE(REPLACE(:NEW.TNAME, ' ', ','), v_word_count); v_tid := ''; -- 遍历每个单词生成TID FOR i IN 1..v_word_count LOOP IF v_word_count = 1 THEN -- 单个单词的情况:取前4个字符 v_tid := SUBSTR(v_words(i), 1, 4); ELSE -- 多个单词的情况:每个单词取前2个字符拼接 v_tid := v_tid || SUBSTR(v_words(i), 1, 2); END IF; END LOOP; -- 把生成的TID赋值给新插入的记录 :NEW.TID := v_tid; END; /
测试示例
- 插入单个单词:
此时INSERT INTO test1(TNAME) VALUES('Motorcycle');TID会是Moto - 插入两个单词:
此时INSERT INTO test1(TNAME) VALUES('Sports Bike');TID会是SpBi
如果你的需求确实是示例里的SB(每个单词取首字母),只需要把触发器里的SUBSTR(v_words(i), 1, 2)改成SUBSTR(v_words(i), 1, 1)就行~
内容的提问来源于stack exchange,提问作者Mr Ghost
相关产品推荐
相关产品推荐

