PL/SQL Cursor雙嵌套的應用

create or replace procedure P_ADD_PROMANAGE_SET AS
/**
物業管理員配置表數據插入,並添加物理員角色
2012年10月23日14:51:40
liys
create table TMP_PROMANAGE_SET
(
  SLEVEL_NAME VARCHAR2(50),
  SLEVEL_CODE VARCHAR2(50),
  LOGONID     VARCHAR2(20)
)--創建表錄入數據
注意:存儲過程中調用其它角色的表,要dba顯式授權
**/

    type   curtyp   is   ref   cursor;
    c1       curtyp; --取臨時表值
    c2       curtyp; --取用戶表值
    m_name varchar2(50);--管理員名稱
    m_code varchar2(32);--管理員編碼
    d_code varchar2(50);--部門編碼
    s_name varchar2(50);--層級名稱           
    s_code varchar2(50);--層級編碼
    l_id varchar2(20):='沒有管理員OA賬號';--登陸用戶名
    ro_id varchar2(32);--物業管理員roleid
    ro_ids varchar2(500);--roleids
    amount number:=0;
   
    sqlstr varchar2(500);
begin

    sqlstr := 'select slevel_name,slevel_code,nvl(logonid,' || '''' || l_id || '''' || ') from lmis.tmp_promanage_set';--引號轉義,要注意
    open c1 for sqlstr;
    loop
           fetch  c1 into s_name, s_code, l_id;
           exit when c1%NOTFOUND;
           if l_id = '沒有管理員OA賬號' then
             insert into lmis.promanage_set(resourceid,slevel_name,slevel_code) values(SYS_GUID(),s_name,s_code);
           else
             select ur.roleid into ro_id from lmis_urms.umrole ur where ur.rolecode = 'wygly';--查出物業管理員roleid
             sqlstr := 'select userid,username,orgid from lmis_urms.umuser where logonid =' || ''''  || l_id ||'''' ;--引號轉義,要注意
             open c2 for sqlstr;
             loop
                     fetch c2 into m_code,m_name,d_code;
                     exit when c2%NOTFOUND;

                     insert into lmis.promanage_set(resourceid,manger_name,manger_code,slevel_name,slevel_code,dept_code)
                     values(SYS_GUID(),m_name,m_code,s_name,s_code,d_code);--表數據插入
                    
                     select roleids into ro_ids from
                     (select * from lmis_urms.umuser u left join lmis_urms.umuserrole ur on u.userid=ur.orgid)
                     where userid = m_code;--根據userid查詢角色集合(如加逗號分開,就有兩個角色:38855abf7ea7413cbde4dd6037b5d54c,38855abf7ea7413cbde4dd6037b5d54c)
                     --sqlstr := ro_ids || ',' || ro_id;
                     SELECT instr(ro_ids,ro_id) into amount FROM dual;--是否存在物業管理員角色
                     if amount>0 then
                        dbms_output.put_line('角色已存在');
                     else
                        update lmis_urms.umuserrole ur set ur.roleids = ro_ids || ',' || ro_id where ur.orgid = m_code;--更新角色
                     end if;
             end loop;
            
             close c2;   
           end if;
           commit; 
           l_id := '沒有管理員OA賬號';     
     end loop;
   
     close c1;
   
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
    ROLLBACK;
END;

發佈了38 篇原創文章 · 獲贊 7 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章