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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: