如何用集合逐位删除字符串末尾数字并保留开头前导零?
解决PL/SQL中逐位删除字符串末尾数字时丢失前导零的问题
你遇到的问题核心是类型不匹配导致的隐性转换——你把CALLED_NBR这个字符串类型的值赋值给了number类型的ids和idx变量。Oracle在将带前导零的字符串转为数字时,会自动丢弃前导零,后续的字符串处理自然就没法保留开头的零了。
同时你的代码里还有个没必要的操作:每次循环都去查询表获取子串,其实完全可以直接在内存里对变量做字符串截取,不用反复查库,既浪费性能又容易出问题。
修改后的代码
declare type t_list is table of mk_suk.CALLED_NBR%type; v_array t_list; -- 把变量类型改成和CALLED_NBR一致的字符串类型,避免隐性转换 idx mk_suk.CALLED_NBR%type; ids mk_suk.CALLED_NBR%type; begin select CALLED_NBR bulk collect into v_array from mk_suk; for i in v_array.first..v_array.last loop dbms_output.put_line(v_array(i)); ids := v_array(i); loop -- 直接在内存中处理字符串,不需要查询表 idx := substr(ids, 1, length(ids) - 1); dbms_output.put_line(idx); exit when length(idx) < 2; ids := idx; end loop; end loop; end; /
关键修改点
- 修正变量类型:将
ids和idx从number改为与CALLED_NBR相同的字符串类型(用%type保证类型一致),彻底避免字符串转数字时丢失前导零的问题。 - 优化逻辑:移除了循环里不必要的
select语句,直接对内存中的ids变量做子串截取,既提升了执行效率,也避免了因表数据变化导致的错误。
正确执行结果
09589583145 0958958314 095895831 09589583 0958958 095895 09589 0958 095 09
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

