是问高人是否有此类更简炼函数吗/
CREATE OR REPLACE PROCEDURE prc_get_char_to_num (p_str IN VARCHAR2)
AS
/*
* 功能:取出含有数字字符串,分别写到数组中.
* eg: abc123def321a1
* 分别提取为a(1):=123,a(2):=321,a(3):=1;
*/
v_len NUMBER(10);
i NUMBER(10);
j NUMBER (10); --数组长度
v_yes BOOLEAN ; -- 是否是数字
v_continu_num BOOLEAN; --是否是连续的数字
v_begin_num BOOLEAN; --数字是否断开
v_last_num BOOLEAN; --最后一个是否是数字
v_num_chr VARCHAR(10);
v_num NUMBER(10);
TYPE array_type IS TABLE OF number(10) INDEX BY BINARY_INTEGER;
v_FEE array_type;
BEGIN
v_len:=length(p_str);
IF v_len IS NOT NULL THEN --如果传进来的参数为空
i:=0;
j:=1;
v_continu_num := FALSE;
v_begin_num :=FALSE;
v_last_num :=FALSE;
for i in 1..v_len loop --(1) 对每个字符进行循环
v_yes := FALSE;
v_continu_num := TRUE;
if to_number(ascii(substr(p_str,i,1)))>=48
and to_number(ascii(substr(p_str,i,1)))<=57 THEN --判断是否是数字
v_yes := TRUE;
v_begin_num := TRUE;
IF i=v_len THEN --如果最后一个字符是数字的情况
-- dbms_output.put_line('number');
v_last_num := TRUE;
END IF;
ELSE
v_continu_num := FALSE;
END IF ;
IF v_yes = TRUE AND v_continu_num = TRUE THEN
v_num_chr :=v_num_chr||substr(p_str,i,1);
END IF;
--如果v_nu_chr已经有数字且数字已经被字符串断开,或者最后一个字符是数字的情况,赋值给字符串
IF (v_continu_num =FALSE AND v_begin_num=TRUE)
OR v_last_num=TRUE THEN
v_num :=to_number(v_num_chr);
v_num_chr :=NULL;
v_begin_num :=FALSE;
v_FEE(j) := v_num;
j := j+1;
END IF;
END LOOP;
-- v_num :=v_fee.COUNT;
for i in 1..v_FEE.COUNT loop --(1)
dbms_output.put_line(i||':='||v_fee(i));
END LOOP;
ELSE
NULL ;
END IF;
END;
/