知識準備
-定長數組
--定長數字型數組,長度爲10
type identifer is varray(10) of number;
如:
set serveroutput on;
declare
type v_array is varray(10) of number;
v_index number;
v_arr v_array;
v_arr := v_array(1,23,567,233,66);
begin
for index in 1..v_arr.count
loop
dbms_output.put_line(v_arr(v_index));
end loop;
end;
/
-變長數組
--可變長數字型數組,數組中元素長度爲10,角標索引爲integer自動增長
type identifer is table of number(10) index by binary_integer;
如:
set serveroutput on;
declare
type v_array is is table of number(10) index by binary_integer;
v_index number;
v_arr v_array;
v_arr := v_array(1,23,567,233,66);
begin
for index in 1..v_arr.count
loop
dbms_output.put_line(v_arr(v_index));
end loop;
end;
/
實戰
-批量更新用戶的在線狀態,userid 爲用戶id,useronline 爲用戶的在線狀態,因用戶的數量無法確定,此處採用可變長數組的定義方式:
--爲了在存儲過程中可以使用自定義的數組類型,此處使用程序包的方式
create or replace package useronline_pkg
as
type int_array is table of number(10) index by binary_integer;
procedure batch_updateuseronline(v_userid in int_array, v_onlines in int_array);
end useronline_pkg;
/
--聲明程序包體
create or replace package body useronline_pkg
as
procedure batch_updateuseronline(v_userid in int_array, v_onlines in int_array)
as
user_id number(10);
user_online number(1);
v_index number(8);
begin
for v_index in 1..v_userid.count
loop
user_id := v_userid(v_index);
user_online := v_onlines(v_index);
--若用戶的在線狀態的記錄已經存在,則只更新其在線狀態;否則,則插入一條記錄
merge into useronline tb
using (select count(userid) as cnt from useronline where userid=user_id) tb_tmp
on(tb_tmp.cnt <> 0)
when matched then
update set tb.onlines=user_online, tb.updatetime=sysdate where userid=user_id
when not matched then
insert values(user_id, user_online, sysdate);
commit;
end loop;
end batch_updateuseronline;
end useronline_pkg;
/
這裏是我的處理方法,如有更好的方法,歡迎指教。