当前位置:首页 » 存储配置 » oracle存储过程分割字符串

oracle存储过程分割字符串

发布时间: 2023-08-09 12:01:49

‘壹’ Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中

‘贰’ Oracle字符串的拆分和拼接

如果是固定的格式,那就好办,检测字段中的“,”分割成四段,然后按要求接起来。

使用函数好些,可以直接调用。

函数写好:已经测试过。

sql">CREATEORREPLACEFUNCTIONjson_montage(JSONINVARCHAR2)RETURNVARCHAR2IS
In_JSONVARCHAR2(4096);
v_JSONVARCHAR2(4096)DEFAULT'{"comicPkgList":[{J1,J2,J4}],J3}';
v_J1VARCHAR2(4096);
v_J2VARCHAR2(4096);
v_J3VARCHAR2(4096);
v_J4VARCHAR2(4096);
v_splitVARCHAR2(10)DEFAULT',';
lenNUMBER(10)default0;
placeNUMBER(10)default2;

BEGIN
In_JSON:=JSON;
/*
原字符串:
{"IsSmsConfirm":false,"proctID":"MDSP3331111","autoReceive":false,"supCycle":1}

期望转换后的:
{"comicPkgList":[{"IsSmsConfirm":false,"proctID":"MDSP3331111","supCycle":1}],"autoReceive":false}
*/
In_JSON:=RTRIM(LTRIM(In_JSON));
place:=INSTR(In_JSON,v_split,2,1);
len:=place-1-1;
v_J1:=SUBSTR(In_JSON,2,len);
len:=INSTR(In_JSON,v_split,2,2)-place-1-0;
v_J2:=SUBSTR(In_JSON,place+1,len);
place:=INSTR(In_JSON,v_split,2,2);

len:=INSTR(In_JSON,v_split,2,3)-place-1-0;
v_J3:=SUBSTR(In_JSON,place+1,len);
place:=INSTR(In_JSON,v_split,2,3);

len:=LENGTH(In_JSON)-place-1;
v_J4:=SUBSTR(In_JSON,place+1,len);


v_JSON:='{"comicPkgList":[{'||v_J1||','||v_J2||','||v_J4||'}],'||v_J3||'}';

IFv_JSON='{"comicPkgList":[{J1,J2,J4}],J3}'THEN
v_JSON:='ERROR';
ENDIF;
RETURNv_JSON;
EXCEPTION
WHENNO_DATA_FOUNDTHEN
NULL;
WHENOTHERSTHEN
RAISE;
ENDjson_montage;
/

‘叁’ 关于oracle 存储过程 如何切割一个字符串 转化为字符数组,然后遍历该数组: 类似ab,12;cd,55;k,7

给你写了个包,包体代码如下:
CREATE OR REPLACE PACKAGE BODY Pkg_Bai 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_Bai;

调用Prc_Test来分隔字符串并按要求比较后插入a表。我测试过,没有问题。
需要注意的是,数据的要求:字符串中每组数据间使用英文小写分号分隔,同一组数据字母在前,数字在后,以英文小写逗号分隔。测试一下吧。
欢迎采纳,不采纳你都对不起我这20分钟。呵呵......

‘肆’ oracle存储过程怎么截取字符串

之前我保存的经典的方法,你可以参考下
首先创建一张表t_al_test_sy
字段分别为:pid,str_id,str_dm,str_mc;
存储过程如下:
create or replace procere p_al_output
as
str_id varchar(60);
str_dm varchar(60);
str_mc varchar(800);
str_start number;
str_len number;
str_length number;
str_end number;
str_count number;
str_content varchar2(800);
str_partcontent varchar2(800);
str_iscontent number;

热点内容
pythonif比较 发布:2025-02-02 05:24:03 浏览:259
已连接的无线网如何知道密码 发布:2025-02-02 04:53:51 浏览:634
android编程入门经典pdf 发布:2025-02-02 04:46:19 浏览:57
安卓什么软件测试手机电池 发布:2025-02-02 04:28:52 浏览:996
手机上传快 发布:2025-02-02 04:27:46 浏览:308
电脑配置详解图解都有哪些 发布:2025-02-02 04:26:27 浏览:716
景区应该有什么配置 发布:2025-02-02 04:09:08 浏览:120
c语言与java工作 发布:2025-02-02 03:59:57 浏览:283
qq买什么不要支付密码 发布:2025-02-02 03:50:29 浏览:495
android读取视频 发布:2025-02-02 03:46:57 浏览:826