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

Oracle APEX中PL/SQL检测字符串重复分隔字符的问题求助

解决Oracle APEX中检测逗号分隔字符串重复项的问题

你的现有代码无法检测到重复项,核心原因是正则表达式(P{2,}?|C{2,}?|W{2,}?|T{2,}?)仅匹配连续出现2次及以上的相同字符,但你的场景是逗号分隔的独立值重复(比如P,T,P,C里的P被逗号隔开),完全不适用。

以下是两种可行的解决方案:

方法一:使用正则表达式匹配非连续重复值

通过捕获分组匹配任意目标代码,再检测其是否在字符串后续位置重复出现:

DECLARE
    v_seccode varchar2(10) := 'P,T,P,C';
BEGIN
    -- 匹配P/C/T/W中任意一个代码重复出现的情况
    if regexp_like(v_seccode, '([PCTW]),.*\1') then
        raise_application_error(-20001,'不能重复列出相同的SEC代码!');
    end if;
END;
/
  • 正则说明:([PCTW])捕获一个目标SEC代码,,.*\1表示后续出现逗号、任意内容后再次出现该捕获的代码。
  • 如果需要忽略大小写,可在regexp_like第三个参数添加'i',即regexp_like(v_seccode, '([PCTW]),.*\1', 'i')。

方法二:拆分字符串统计重复项(更通用可靠)

如果SEC代码可能是多字符、分隔符有变化,拆分字符串后统计每个代码的出现次数是更稳妥的方式:

DECLARE
    v_seccode varchar2(10) := 'P,T,P,C';
    v_dup_count number;
BEGIN
    -- 拆分逗号分隔的字符串为单行数据,统计重复项数量
    select count(*)
    into v_dup_count
    from (
        select regexp_substr(v_seccode, '[^,]+', 1, level) as sec_code
        from dual
        connect by regexp_substr(v_seccode, '[^,]+', 1, level) is not null
    )
    group by sec_code
    having count(*) > 1;
    
    -- 存在重复项则触发错误
    if v_dup_count > 0 then
        raise_application_error(-20001,'不能重复列出相同的SEC代码!');
    end if;
END;
/
  • 逻辑说明:用regexp_substr结合connect by拆分字符串为多行,分组后统计每个代码的出现次数,只要有出现次数大于1的项,就触发错误提示。

内容的提问来源于stack exchange,提问作者LogicallyFunky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:15:35