oracle技术之自定义数组及应用
2013-05-15 11:17
295 查看
--------------------自定义数组类型
CREATE OR REPLACE TYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);
/
------------------以特定符号分割并存储到数组
CREATE OR REPLACE FUNCTION sf_split_string (string VARCHAR2, substring VARCHAR2) RETURN Varchar2Varray IS
len integer := LENGTH(substring);
lastpos integer := 1 - len;
pos integer;
num integer;
i integer := 1;
ret Varchar2Varray := Varchar2Varray(NULL);
BEGIN
LOOP
pos := instr(string, substring, lastpos + len);
IF pos > 0 THEN --found
num := pos - (lastpos + len);
ELSE --not found
num := LENGTH(string) + 1 - (lastpos + len);
END IF;
IF i > ret.LAST THEN
ret.EXTEND;
END IF;
ret(i) := SUBSTR(string, lastpos + len, num);
EXIT WHEN pos = 0;
lastpos := pos;
i := i + 1;
END LOOP;
RETURN ret;
END;
/
-----------------------------计算字符串内特定字符的总记录数
create or replace function str_cnt(aa varchar2,bb varchar2)
return number
is
num number(10):=0;
begin
for i in 1..length(aa) loop
if instr(aa,bb,1,i)>0 then
num:=num+1;
else
return num;
end if;
end loop;
return num;
end;
/
-------------------创建存储过程
-------------------v_ids : 输入的字符串
-------------------sub : 指定的分割字符串
-------------------rowCnt :接收参数
CREATE OR REPLACE PROCEDURE pro_updateCount(
v_ids in VARCHAR2,
sub in VARCHAR2 ,
rowCnt out Number
)
AS
cnt Number := 0;
ret Varchar2Varray := Varchar2Varray(NULL);
BEGIN
ret := sf_split_string(v_ids,sub);
FOR i in 1..str_cnt(v_ids , sub) LOOP
update tbl_login_member t set t.accountid = SEQ_PRO_UPDATECOUNT.Nextval where t.userid = ret(i);
dbms_output.put_line(ret(i));
if(sql%rowcount = 1) then
begin
cnt := cnt+1;
end;
end if;
END LOOP;
rowCnt := cnt;
END;
/
----------------接收值
declare
cout number;
begin
pro_updateCount('ms006,MS005,ms004,' , ',' ,cout);
dbms_output.put_line(cout);
end;
/
--------------------------------------------------------------------------------------------------------------------
if exists(select * from sysobjects where name='pro_updateCount')
drop proc pro_updateCount
go
create PROCEDURE pro_updateCount
@str nvarchar(200),
@count int OUTPUT,
@i int,
@index_len int ,
@substr nvarchar(20),
@sequence int
AS
select @count = 0
select @i=1
select @sequence= (select MAX(t.AccountID) from tbl_login_member t)
while 1=1
begin
select @index_len=charindex(',',@str ,@i)
if(@index_len=0)
break;
else
begin
select @sequence = @sequence+ 1;
select @substr = substring(@str ,@i
,@index_len-@i);
update tbl_login_member set accountid
=@sequence where userid
=@substr;
if @@ROWCOUNT <> 0
begin
select @count =@count +1;
end
select @i=@index_len+1;
print(@sequence);
print(@substr);
end
end
return @count ;
go
CREATE OR REPLACE TYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);
/
------------------以特定符号分割并存储到数组
CREATE OR REPLACE FUNCTION sf_split_string (string VARCHAR2, substring VARCHAR2) RETURN Varchar2Varray IS
len integer := LENGTH(substring);
lastpos integer := 1 - len;
pos integer;
num integer;
i integer := 1;
ret Varchar2Varray := Varchar2Varray(NULL);
BEGIN
LOOP
pos := instr(string, substring, lastpos + len);
IF pos > 0 THEN --found
num := pos - (lastpos + len);
ELSE --not found
num := LENGTH(string) + 1 - (lastpos + len);
END IF;
IF i > ret.LAST THEN
ret.EXTEND;
END IF;
ret(i) := SUBSTR(string, lastpos + len, num);
EXIT WHEN pos = 0;
lastpos := pos;
i := i + 1;
END LOOP;
RETURN ret;
END;
/
-----------------------------计算字符串内特定字符的总记录数
create or replace function str_cnt(aa varchar2,bb varchar2)
return number
is
num number(10):=0;
begin
for i in 1..length(aa) loop
if instr(aa,bb,1,i)>0 then
num:=num+1;
else
return num;
end if;
end loop;
return num;
end;
/
-------------------创建存储过程
-------------------v_ids : 输入的字符串
-------------------sub : 指定的分割字符串
-------------------rowCnt :接收参数
CREATE OR REPLACE PROCEDURE pro_updateCount(
v_ids in VARCHAR2,
sub in VARCHAR2 ,
rowCnt out Number
)
AS
cnt Number := 0;
ret Varchar2Varray := Varchar2Varray(NULL);
BEGIN
ret := sf_split_string(v_ids,sub);
FOR i in 1..str_cnt(v_ids , sub) LOOP
update tbl_login_member t set t.accountid = SEQ_PRO_UPDATECOUNT.Nextval where t.userid = ret(i);
dbms_output.put_line(ret(i));
if(sql%rowcount = 1) then
begin
cnt := cnt+1;
end;
end if;
END LOOP;
rowCnt := cnt;
END;
/
----------------接收值
declare
cout number;
begin
pro_updateCount('ms006,MS005,ms004,' , ',' ,cout);
dbms_output.put_line(cout);
end;
/
--------------------------------------------------------------------------------------------------------------------
if exists(select * from sysobjects where name='pro_updateCount')
drop proc pro_updateCount
go
create PROCEDURE pro_updateCount
@str nvarchar(200),
@count int OUTPUT,
@i int,
@index_len int ,
@substr nvarchar(20),
@sequence int
AS
select @count = 0
select @i=1
select @sequence= (select MAX(t.AccountID) from tbl_login_member t)
while 1=1
begin
select @index_len=charindex(',',@str ,@i)
if(@index_len=0)
break;
else
begin
select @sequence = @sequence+ 1;
select @substr = substring(@str ,@i
,@index_len-@i);
update tbl_login_member set accountid
=@sequence where userid
=@substr;
if @@ROWCOUNT <> 0
begin
select @count =@count +1;
end
select @i=@index_len+1;
print(@sequence);
print(@substr);
end
end
return @count ;
go
相关文章推荐
- oracle技术之自定义数组及应用
- oracle异常(预定义异常,自定义异常)应用介绍
- oracle全文检索技术应用
- Oracle技术之常数复合索引应用案例
- oracle分区技术在计费中的应用论证 (转载自ITPUB)
- oracle数组的简单介绍及应用
- 用于自定义数组/结构体数组的剪切板应用模板类
- WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现
- Oracle的split函数, 数组应用必备
- << Oracle高可用>>部分书面作业 - 第九课 RAC+DG技术的应用
- C# 自定义数据类型 数组应用 读取XML
- 【Android应用开发技术:用户界面】自定义View类设计
- Oracle技术之常数复合索引应用案例
- Oracle VPD技术在中联his系统中的应用
- oracle 自定义数组 以及数组 table() 查询
- oracle自定义数组
- [DB]Oracle数据快照技术在数据交换中的应用
- oracle异常(预定义异常,自定义异常)应用介绍
- Oracle技术之基于自定义函数的Function-Based索引创建
- ORACLE 管道技术应用