2014-10-19 72 views
1

我有一个插槽号码,如slot001。现在我必须增加一些user_input的值(比如5)。输出应该是:如何在oracle中增加具有数字字段的字符串?

slot001 
slot002 
slot003 
slot004 
slot005 

我曾尝试写一段代码,但它无法slot001slot1区分。字符串长度不固定,但是它将是字数格式。

我的方法:

CREATE OR REPLACE PROCEDURE Pr_procedure_poc 
(
    slot_numin IN VARCHAR2, 
    range_countin IN NUMBER 
) is 
v_slt_num  NUMBER; 
v_slot  VARCHAR2(100) := slot_numin; 
v_slt_var  VARCHAR2(100); 
v_temp  VARCHAR2(100); 

begin 
     SELECT Regexp_substr(slot_numin, '\d+') 
     INTO v_slt_num 
     FROM dual; 

     SELECT Regexp_substr(slot_numin, '\D+') 
     INTO v_slt_var 
     FROM dual; 

FOR i IN 0 .. (range_countin -1) LOOP --range_countin :=user input to increament the string 

v_temp := v_slt_num + i; 
v_slot := v_slt_var||v_temp; 

end loop; 

end 
Pr_procedure_poc; 

输出slot_numin = 'ABC001' 和范围= 10:

abc1 
abc2 
abc3 
abc4 
abc5 
abc6 
abc7 
abc8 
abc9 
abc10 

输出slot_numin = 'ABC1' 和范围= 10:

abc1 
abc2 
abc3 
abc4 
abc5 
abc6 
abc7 
abc8 
abc9 
abc10 

预期输出: slot_numin ='abc001'的输出和范围= 10:

ABC001

abc002 
abc003 
abc004 
abc005 
abc006 
abc007 
abc008 
abc009 
abc010 

输出slot_numin = 'ABC1' 和范围= 10:

abc1 
abc2 
abc3 
abc4 
abc5 
abc6 
abc7 
abc8 
abc9 
abc10 

回答

0

扩展你的正则表达式查找是否有前导零与否,如果是,则使用与领先的格式零点在to_char()功能:

v_temp := to_char(v_slt_num + i, 'fm09999'); 
0

扩大在生锈的答案很简单:

declare 
    slot_numin varchar2(100) := 'slot0001'; 
    varpart varchar2(100) := regexp_substr(slot_numin, '\D+'); 
    numpart varchar2(100) := regexp_substr(slot_numin, '\d+'); 
    digits  number := length(numpart); 
begin 
    for i in 1..9 loop 
    dbms_output.put_line(
    varpart 
    || to_char((to_number(numpart) + i),'fm'||rpad('0',digits,'0')) 
    ); 
    end loop; 
end; 

结果:

slot0002 
slot0003 
slot0004 
slot0005 
slot0006 
slot0007 
slot0008 
slot0009 
slot0010