在PL/SQL中自定義數組類型

知識準備

-定長數組

--定長數字型數組,長度爲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;
/

這裏是我的處理方法,如有更好的方法,歡迎指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章