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

假设表: tb字段: id(标识) name(名字) describe(描述)要求将字段name 和 describe 取出,并将describe字段以逗号为分界截取子串后,将子串中包含‘XXX’字符的部分存储到另一张表中,要求在存储过程中实现.请各位大侠写的详细点...小弟初学PL/SQL
最新回答
献世佛

2024-04-25 01:21:28

--通过游标遍历调用方法拆取存表:

--方法

create or replace function f_test_substr(
prm1 varchar2,    --地
prm2 varchar2 ,   --名称
prm3 varchar2,    --IP
prm4 varchar2    --结果
)
return varchar2
as
v_n int:=0;  --第几次取
v_l int;  --:截取次数
v_s varchar2(2000);  --处理拆分字符串
v_s1 varchar2(200);  --本次拆分
v_s2 varchar2(200);  --本次剩余
v_type varchar2(100);  --设备类型
v_code varchar2(100);  --设备编号
v_desc varchar2(100);  --设备描述
v_errmsg varchar2(200);
begin
v_l:=length(prm4)-length(replace(prm4,';',''));
v_s:=prm4||';';
v_s1:=substr(v_s,1,instr(v_s,';',1,1));
v_s2:=replace(v_s,v_s1,'');
while v_n<=v_l loop
v_s2:=replace(v_s2,v_s1,'');
v_s1:=substr(v_s1,1,length(v_s1)-1);
v_type:=substr(v_s1,1,instr(v_s1,',',1,1)-1);
v_code:=substr(v_s1,instr(v_s1,',',1,1)+1,instr(v_s1,',',1,2)-instr(v_s1,',',1,1)-1);
v_desc:=substr(v_s1,instr(v_s1,',',1,2)+1,instr(v_s1||',',',',1,3)-instr(v_s1,',',1,2)-1);
insert into t_test_str(a,b,c,d,e,f) values(prm1,prm2,prm3,substr(v_type,instr(v_type,']',1)+1),v_code,v_desc);
v_n:=v_n+1;
v_s1:=substr(v_s2,1,instr(v_s2,';',1,1));
end loop;
commit;
return '成功';

exception
when others then
v_errmsg:=substr(sqlerrm,1,200);
return v_errmsg ;

end;

--存过

create or replace procedure p_test_substr1(o_result out varchar2)

as
v_a varchar2(20);
v_b varchar2(20);
v_c varchar2(20);
v_d varchar2(2000);
v_num int;
cursor c_str is
SELECT * from t_test_substr
;
begin
select count(1) into v_num from t_test_substr;
while v_num>0 loop
open c_str;
loop
FETCH c_str INTO
v_a,v_b,v_c,v_d;
EXIT WHEN c_str%NOTFOUND;

o_result:=f_test_substr(v_a,v_b,v_c,v_d);
v_num:=v_num-1;
end loop;
CLOSE c_str;
end loop;
end;

效果见图:

愛你不愛你

2024-04-25 01:07:25

create or replace procedure 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;

cursor c_findsy is select id,dm, mc from t_sgg_findkey where mc like '%石油%' ;--定义游标begin open c_findsy;--打开游标

loop --循环
fetch c_findsy into str_id,str_dm,str_mc;--获取游标中的字段值,并赋值给变量
exit when c_findsy%notfound;--判断,当游标取不到数据时,跳出循环 str_start := 0;
str_count := 0; loop
str_start := str_count + 1;--获取截取字符串起始索引
--select instr(str_mc,',',str_count+1,1) into str_count from dual;--获取','索引
str_count:=instr(str_mc,',',str_count+1,1);
str_end := str_count - 1;--获取截取字符串终止索引
--str_length := str_end - str_start + 1;--获取截取字符串长度 if str_count<>0--判断,如果str_count不等于0
then
str_len := str_end - str_start + 1;--获取截取字符串长度
else
select length(str_mc) into str_length from dual;--获取全字符串长度
str_len := length(str_mc) - str_start + 1; end if;
select substr(str_mc,str_start,str_len) into str_partcontent from dual;--截取字符串 获得所需字符串 select instr(str_partcontent,'石油',1,1) into str_iscontent from dual;--判断截取字符串是否包含'石油'字段
if str_iscontent<>0--如果包含 则执行 如下操作
then

begin
insert into t_al_test_sy(pid,str_id,str_dm,str_mc) values(sq_hr_test_sypid.nextval,str_id,str_dm,str_partcontent);
exception when others then
--rollback;
--return;
--t_bj:='0';
null;
end;
end if; exit when str_count=0;--当在所剩字符串中未找到','时退出
end loop;
--if t_bj='0' then
-- rollback;
--else
-- commit;
--end if;
end loop;
commit;
close c_findsy;
end;
浅夏凉眸

2024-04-25 00:43:05

之前我保存的经典的方法,你可以参考下
首先创建一张表t_al_test_sy
字段分别为:pid,str_id,str_dm,str_mc;
存储过程如下:
create or replace procedure 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;

cursor c_findsy is select id,dm, mc from t_sgg_findkey where mc like '%石油%' ;--定义游标begin open c_findsy;--打开游标

loop --循环
fetch c_findsy into str_id,str_dm,str_mc;--获取游标中的字段值,并赋值给变量
exit when c_findsy%notfound;--判断,当游标取不到数据时,跳出循环 str_start := 0;
str_count := 0; loop
str_start := str_count + 1;--获取截取字符串起始索引
--select instr(str_mc,',',str_count+1,1) into str_count from dual;--获取','索引
str_count:=instr(str_mc,',',str_count+1,1);
str_end := str_count - 1;--获取截取字符串终止索引
--str_length := str_end - str_start + 1;--获取截取字符串长度 if str_count<>0--判断,如果str_count不等于0
then
str_len := str_end - str_start + 1;--获取截取字符串长度
else
select length(str_mc) into str_length from dual;--获取全字符串长度
str_len := length(str_mc) - str_start + 1; end if;
select substr(str_mc,str_start,str_len) into str_partcontent from dual;--截取字符串 获得所需字符串 select instr(str_partcontent,'石油',1,1) into str_iscontent from dual;--判断截取字符串是否包含'石油'字段
if str_iscontent<>0--如果包含 则执行 如下操作
then

begin
insert into t_al_test_sy(pid,str_id,str_dm,str_mc) values(sq_hr_test_sypid.nextval,str_id,str_dm,str_partcontent);
exception when others then
--rollback;
--return;
--t_bj:='0';
null;
end;
end if; exit when str_count=0;--当在所剩字符串中未找到','时退出
end loop;
--if t_bj='0' then
-- rollback;
--else
-- commit;
--end if;
end loop;
commit;
close c_findsy;
end;