您的位置:首页 > 数据库 > Oracle

oracle 一行变多行,pl/sql

2013-11-23 22:29 776 查看
建表语句:

create table MY_CHANGE (MY_ID int,

MY_VALUE varchar(100));

insert into MY_CHANGE values(1,'a,b,c');

insert into MY_CHANGE values(2,'d,r');

insert into MY_CHANGE values(3,'x,y,z');

commit;

所谓的一行变多行就是要实现下面的效果:

1 a

1 b

1 c

2 d

2 r

3 x

3 y

3 z

pl/sql:

declare num int; --判断表是否存在的标识

cur_my_ID int; --游标变量值

cur_my_value varchar2(100); --游标变量值

s1 varchar(100);

s2 varchar(100); --s1,s2为拆分做准备

len_1 int; --字符串长度

cursor cur_my is

select my_ID,my_value from my_change; --定义游标

begin

/*

* 存在表MY_TABLE则删除,不存在则创建

*/

select count(1) into num from all_tables where TABLE_NAME = 'MY_TABLE' and OWNER='SCOTT';

if(num=1) then

execute immediate 'drop table MY_TABLE';

end if;

execute immediate '

create table MY_TABLE(

my_ID int,

my_value_now varchar2(100))';

open cur_my;

fetch cur_my into cur_my_id,cur_my_value;

while cur_my%found

loop --外循环,游标取值

select replace(cur_my_value,',','') into s1 from dual; -- 去除字符中间的 ,

select length(s1) into len_1 from dual; -- 取当前字符串长度

while len_1>0 --内循环,拆分数据

loop

s2:=substr(s1,1,1); -- 取出第一个字符

insert into my_table values(cur_my_id,s2); --插入

s1:=substr(s1,2,len_1-1); -- 把第一个字符删除

len_1:=len_1-1; -- 循环次数-1

end loop;

fetch cur_my into cur_my_id,cur_my_value;

end loop;

close cur_my;

end ;

存储过程:

create or replace

procedure cc as

num int; --判断表是否存在

cur_my_ID int; --游标值

cur_my_value varchar2(100); --游标值

s1 varchar(100);

s2 varchar(100);

len_1 int;

cursor cur_my is

select my_ID,my_value from my_change;

str_sql varchar2(500);

tb_name varchar2(100);

begin

tb_name:='MY_TABLE';

select count(1) into num from all_tables where TABLE_NAME = 'MY_TABLE' and OWNER='SCOTT';

if(num=1) then

str_sql:='drop table '|| tb_name;

execute immediate str_sql;

end if;

str_sql:=' create table '|| tb_name ||' (

my_ID int,

my_value_now varchar2(100))';

execute immediate str_sql;

open cur_my;

fetch cur_my into cur_my_id,cur_my_value;

while cur_my%found

loop

select replace(cur_my_value,',','') into s1 from dual; -- 去除字符中间的 ,

select length(s1) into len_1 from dual; -- 取当前字符串长度

while len_1>0

loop

s2:=substr(s1,1,1); -- 取出第一个字符

str_sql:='insert into '|| tb_name|| '(my_ID,my_value_now) values(' || cur_my_id ||','''|| s2 ||''')'; --两个单引号输出单引号

execute immediate str_sql;

-- dbms_output.put_line(s2); -- 输出

s1:=substr(s1,2,len_1-1); -- 把第一个字符删除

len_1:=len_1-1; -- 循环次数-1

end loop;

fetch cur_my into cur_my_id,cur_my_value;

end loop;

close cur_my;

end cc;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: