oracle自定义函数,去除字段内所有括号报 - 字符串连接的结果过长

__努力的小白 2017-03-24 10:52:58
小弟需要做一个功能需要去除一个字段内所有括号和括号内的值,于是参考了一下网上的帖子,自己写了一个函数如下

但是在使用过程中,28、29两行一直报ORA - 01489(字符串连接的结果过长)的错误,但是这个字段没有超过4000个长度的内容,而且理论上说内容是越截取越短,所以一直找不到错误原因。简单测试了下,如果把内容截取的前一段和后一段单独写 || 连接操作,就不会报错,但是一用这个函数就报错,小弟是做java的,oracle只是略知一点,请大神指导下。
...全文
842 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
苜空一窃 2017-06-25
  • 打赏
  • 举报
回复
老哥,db2中怎么解决这个问题啊,正则用不了啊,语法不对
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
引用 7 楼 Diza1986 的回复:
还是用正则,考虑嵌套狂魔就只能循环了,括号不配对那就是数据问题了

CREATE OR REPLACE FUNCTION REPLACE_KUOHAO(STR IN VARCHAR2)
RETURN VARCHAR2
IS
    TEMPSTR VARCHAR2(4000) := STR;
BEGIN
    WHILE INSTR(TEMPSTR,'(') > 0 AND INSTR(TEMPSTR,')') > 0 LOOP
        SELECT REGEXP_REPLACE(TEMPSTR,'\([^\(\)]*\)') INTO TEMPSTR FROM DUAL;
    END LOOP;
    RETURN TEMPSTR;
END;

select REPLACE_KUOHAO('(start)123()45(ab(d(t)ef)c)6789(end)') from dual
嵌套倒是没有,多括号的有很多。我先试一下这个正则 谢谢
Diza1986 2017-03-24
  • 打赏
  • 举报
回复
还是用正则,考虑嵌套狂魔就只能循环了,括号不配对那就是数据问题了

CREATE OR REPLACE FUNCTION REPLACE_KUOHAO(STR IN VARCHAR2)
RETURN VARCHAR2
IS
    TEMPSTR VARCHAR2(4000) := STR;
BEGIN
    WHILE INSTR(TEMPSTR,'(') > 0 AND INSTR(TEMPSTR,')') > 0 LOOP
        SELECT REGEXP_REPLACE(TEMPSTR,'\([^\(\)]*\)') INTO TEMPSTR FROM DUAL;
    END LOOP;
    RETURN TEMPSTR;
END;

select REPLACE_KUOHAO('(start)123()45(ab(d(t)ef)c)6789(end)') from dual
Diza1986 2017-03-24
  • 打赏
  • 举报
回复
引用 5 楼 qq_35865071 的回复:
[quote=引用 4 楼 Diza1986 的回复:] 没看你的程序问题在哪,去掉括号的话,正则表达式更好吧

select REGEXP_REPLACE('12345(asdasda)6789','\(.*\)') from dual
我这个字段,括号内内容的长度都不一样,我之前试过正则,但是效果不理想,有的该去掉的没去掉。 我是目的是在一个查询sql中,得到去括号之后的值,像下面这样 SELECT * from ADD_TEST ad, FEI_TEST hz where (func_replace_kuohao(ad.busiscope) like '%金融%' or ad.entname like '%金融%')and hz.keyword='金融' ORDER BY ad.PRIPID;[/quote] 那个目标项目中会有不止一对括号而且有可能嵌套的话是有些麻烦哈
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
引用 4 楼 Diza1986 的回复:
没看你的程序问题在哪,去掉括号的话,正则表达式更好吧

select REGEXP_REPLACE('12345(asdasda)6789','\(.*\)') from dual
我这个字段,括号内内容的长度都不一样,我之前试过正则,但是效果不理想,有的该去掉的没去掉。 我是目的是在一个查询sql中,得到去括号之后的值,像下面这样 SELECT * from ADD_TEST ad, FEI_TEST hz where (func_replace_kuohao(ad.busiscope) like '%金融%' or ad.entname like '%金融%')and hz.keyword='金融' ORDER BY ad.PRIPID;
Diza1986 2017-03-24
  • 打赏
  • 举报
回复
没看你的程序问题在哪,去掉括号的话,正则表达式更好吧

select REGEXP_REPLACE('12345(asdasda)6789','\(.*\)') from dual
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
人工置顶...
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
球大神
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
顶。。。。。。。。。。
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
引用 14 楼 Diza1986 的回复:
好的,非常感谢!
Diza1986 2017-03-24
  • 打赏
  • 举报
回复
引用 13 楼 Diza1986 的回复:
[quote=引用 12 楼 qq_35865071 的回复:] [quote=引用 10 楼 Diza1986 的回复:]
基本上解决了,非常感谢。想再问一下,同时去中文和英文括号的话,应该怎么写[/quote] 比较简单的做法是先把中文括号replace成英文括号,反过来也成 然后就和上面问题一样了[/quote] 用translate方便些
Diza1986 2017-03-24
  • 打赏
  • 举报
回复
引用 12 楼 qq_35865071 的回复:
[quote=引用 10 楼 Diza1986 的回复:]
基本上解决了,非常感谢。想再问一下,同时去中文和英文括号的话,应该怎么写[/quote] 比较简单的做法是先把中文括号replace成英文括号,反过来也成 然后就和上面问题一样了
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
引用 10 楼 Diza1986 的回复:
基本上解决了,非常感谢。想再问一下,同时去中文和英文括号的话,应该怎么写
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
引用 10 楼 Diza1986 的回复:
我没怎么用过正则,更没自己写过表达式....不好意思 我再试试 非常感谢
Diza1986 2017-03-24
  • 打赏
  • 举报
回复
引用 9 楼 qq_35865071 的回复:
我只需要去除中文的括号就可以,请问正则该怎么写,我把你的那个函数用plsql试了试,显示一直loop,测试数据是:
'\([^()]*\)' 你这个匹配没改完整啊,中间改了,外面没改 '([^()]*)' 这样吧
__努力的小白 2017-03-24
  • 打赏
  • 举报
回复
引用 7 楼 Diza1986 的回复:
我只需要去除中文的括号就可以,请问正则该怎么写,我把你的那个函数用plsql试了试,显示一直loop,测试数据是:

create or replace function func_replace_kuohao_zhengze
(
       busiscope in varchar2
)
return varchar2
is
       tempbusiscope varchar2(4000) := busiscope;
   begin
     Dbms_Output.Put_Line('执行完begin:');
     while instr(tempbusiscope,'(') > 0 and instr(tempbusiscope,')') >0
       loop
          Dbms_Output.Put_Line('进入loop:');
         select  regexp_replace(tempbusiscope,'\([^()]*\)') into tempbusiscope from dual;
       end loop;
       return tempbusiscope;
   end;

select func_replace_kuohao_zhengze('销售:化工产品(不含危险化学品及一类易制毒化学品)、机械设备、日用百货、针纺织品、电线电缆、五金交电、建筑材料;化工产品的技术研发(不含危险化学品及一类易制毒化学品)。经营其它无需行政审批即可经营的一般经营项目。(依法须经批准的项目,经相关部门批准后方可开展经营活动)。') from dual

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧