如何在oracle中增加一个包含数字字段的字符串?

时间:2014-10-19 21:26:25

标签: sql oracle stored-procedures plsql

我有一个像slot001这样的插槽号码。现在我必须增加一些user_input值(比如说5)。输出应该是:

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

2 个答案:

答案 0 :(得分:0)

扩展正则表达式以查找是否存在前导零,如果是,则在to_char()函数中使用带前导零的格式:

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

答案 1 :(得分:0)

扩展Rusty的简短回答:

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