我想删除字符串的最后一个数字一个接一个使用收集,但当我删除最后一个数字,它也从开始删除零
declare
type t_list is table of mk_suk.CALLED_NBR%type;
v_array t_list;
idx number;
ids number;
begin
select substr(CALLED_NBR,1,(LENGTH(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
select substr(ids,1,(LENGTH(ids)-1)) into idx from mk_suk where CALLED_NBR=v_array(i);
ids:=idx;
dbms_output.put_line(idx);
exit when length(idx)\<2;
end loop;
end loop;
end;
/
字符串
查询结果
09589583145
958958314
95895831
9589583
958958
95895
9589
958
95
9
型
4条答案
按热度按时间ijxebb2r1#
oracle不会“从开始处删除零”,而是将其转换为数字。数字0001与1相同,变量
ids
和idx
都是数字。字符串
所以在一个循环中有一个区别:
型
vc9ivgsu2#
你的代码是错误的,因为-在声明部分-你将两个变量都声明为
NUMBER
。如果它们是 * 字符串 *(并且代码被修改-为什么再次从表中获取,如果你已经在集合中有了那个值?),它 * 工作 *:样本数据:
字符串
您的代码,已修改:
型
测试结果:
型
vcudknz33#
您正在为
ids
和idx
变量使用NUMBER
数据类型。NUMBER
是一种二进制数据类型,每2位使用1个字节,并且不存储前导零或尾随十进制零(由于0123
,123
和123.000
都具有相同的数值),并且从不以任何特定的人类可读格式存储(因为它使用二进制格式)。如果你想保留前导零,那么不要使用
NUMBER
,而使用VARCHAR2
,或者继续使用列数据类型MK_SUK.CALLED_NBR%TYPE
。然而,你不需要所有的临时变量,可以简化代码:
字符串
然后,如果你有样本数据:
型
输出为:
型
fiddle
mw3dktmi4#
你有没有考虑过用一个简单的SQL来做这件事:
字符串
如果目标是使用collection来解决这个问题,那么相同的SQL可以在PL/SQL块中完成这项工作,如下所示:
型