You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:10:44