关于oracle 存储过程 如何切割一个字符串 转化为字符数组,然后遍历该数组: 类似ab,12;cd,55;k,7
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于oracle 存储过程 如何切割一个字符串 转化为字符数组,然后遍历该数组: 类似ab,12;cd,55;k,7相关的知识,希望对你有一定的参考价值。
如何将上述的字符串切割完成,然后分别让v_s=所有的字母组成的子字符串,如ab,cd,k 让v_n=所有的数字!关键是这中二维数组的组合不是固定长度的。所以,有木有大神帮忙写下,这个存储过程,具体是:给定一个字符串“ab,12;cd,55;k,7.......”然后,获得每组的数字部分,如果数字大于20,则把字母子字符串和数字插入到表A中。CREATE OR REPLACE PROCEDURE strsplit....
参考技术A 给你写了个包,包体代码如下:CREATE OR REPLACE PACKAGE BODY Pkg_Baidu IS
-- 自定义个数组类型
TYPE Typ_Str_Array IS TABLE OF VARCHAR2(200) INDEX BY BINARY_INTEGER;
PROCEDURE Prc_String_To_Array(Pv_i_String IN VARCHAR2,
Pv_i_Identifier IN VARCHAR2,
Pt_o_Array OUT Typ_Str_Array) IS
Lv_Tmpstr VARCHAR2(200);
Lv_Changed_String VARCHAR2(4000);
BEGIN
-- 初始化
Lv_Changed_String := Pv_i_String;
-- 拆分逻辑
-- 1.字符串中没有标识符
IF Instr(Pv_i_String, Pv_i_Identifier, 1, 1) = 0 THEN
Pt_o_Array(Pt_o_Array.Count + 1) := Pv_i_String;
ELSE
-- 2.字符串中有标识符
WHILE Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) > 0 LOOP
Lv_Tmpstr := Substr(Lv_Changed_String,
1,
Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) - 1);
Pt_o_Array(Pt_o_Array.Count + 1) := Lv_Tmpstr;
Lv_Changed_String := Substr(Lv_Changed_String,
Instr(Lv_Changed_String, Pv_i_Identifier, 1, 1) + 1,
Length(Lv_Changed_String));
END LOOP;
-- 3.最有一个被拆分出来的字符串中不含标识符
IF NOT Lv_Changed_String IS NULL THEN
-- 将最后一个保存
Pt_o_Array(Pt_o_Array.Count + 1) := Lv_Changed_String;
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
PROCEDURE Prc_Test(Pv_i_Str IN VARCHAR2) IS
--定义数组
Lt_Array Typ_Str_Array;
Ln_Count NUMBER; -- 数组元素个数
Ln_Num NUMBER;
Lv_Value VARCHAR2(30);
BEGIN
Prc_String_To_Array(Pv_i_Str, ';', Lt_Array);
-- 循环数组
FOR i IN 1 .. Lt_Array.Count LOOP
-- 获取每个元素中数值
Ln_Num := To_Number(TRIM(Substr(Lt_Array(i), Instr(Lt_Array(i), ',', -1) + 1)));
IF Ln_Num > 20 THEN
Lv_Value := TRIM(Substr(Lt_Array(i), 1, Instr(Lt_Array(i), ',', -1) - 1));
INSERT INTO a (col_a) VALUES (lv_value);
END IF;
END LOOP;
END;
END Pkg_Baidu;
调用Prc_Test来分隔字符串并按要求比较后插入a表。我测试过,没有问题。
需要注意的是,数据的要求:字符串中每组数据间使用英文小写分号分隔,同一组数据字母在前,数字在后,以英文小写逗号分隔。测试一下吧。
欢迎采纳,不采纳你都对不起我这20分钟。呵呵......本回答被提问者和网友采纳
关于SQLSERVER存储过程的问题,求解
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'salary_test_data' AND type = 'P') drop PROCEDURE salary_test_data GOcreate procedure salary_test_data @val VARCHAR OUTPUT AS begin set @val = '12222' endGO declare @val VARCHAR exec salary_test_data @val print 'val:' + @val GO
这段要分几部分解释IF EXISTS (SELECT name FROM sysobjects WHERE name = 'salary_test_data' AND type = 'P') drop PROCEDURE salary_test_data GO--验证是否存在存储过程salary_test_data ,如果存在就直接删除
create procedure salary_test_data @val VARCHAR OUTPUT AS begin set @val = '12222' endGO --创建存储过程 salary_test_data 设置输出变量 @val 输出值为12222
declare @val VARCHAR --定义变量 @val
exec salary_test_data @val --执行前面定义的存储过程salary_test_data 用变量 @val接收输出值
print 'val:' + @val GO --打印@val输出的结果 打印内容为: val:12222 参考技术A 如果存在(选出的的名称从每个数据库所有数据库对象,那么=薪水_测试_数据和类型=p)删除程序薪水_测试_数据创建程序薪水_测试_数据定义变量然后输出当设置为12222
然后开始声明 最后12222 参考技术B val:12222
以上是关于关于oracle 存储过程 如何切割一个字符串 转化为字符数组,然后遍历该数组: 类似ab,12;cd,55;k,7的主要内容,如果未能解决你的问题,请参考以下文章
oracle存储过程传入一个字符串参数'1,2,3,4,5,6,7,8',如何分割并转为数字?
mysql 存储过程,如何把一个 字符串变成一个 整形数 比如 “33” 变成整数的33