部门326为部门329的父部门,部门2与部门326是同级部门;
账户muyunfei,属于329部门
消息发送给部门2及部门326两个部门(326|2),发送的部门对象之间用“|”分割
查询:muyunfei账户是否属于该部门字符串(329|2)或者该部门字符串的子部门中
1、首先使用start with。。。。。connect by获得账户muyunfei的部门及父部门
2、遍历部门及父部门,在循环体重嵌套循环(该循环拆分以“|”为分隔符的部门号),在嵌套的循环体中判断,两结果是否相同,相同,即人属于当前部门或其子部门,返回1结束循环,否则继续循环
create or replace function check_User_in_dept(to_party_id varchar2, --部门id,多个用|分割
cur_user_id varchar2 --人员id
) return varchar2 as
/*
功能:判断当前人是是否属于当前部门中
* 1当前人属于该部门,0不属于
*/
party_str varchar2(200);
v_length NUMBER := LENGTH(to_party_id);
v_start NUMBER := 1;
v_index NUMBER;
cursor c_1 is
select *
from wx_party a
start with a.party_id = (select b.department
from wx_contacts b
where b.user_id = cur_user_id)
connect by a.party_id = prior a.parent_id;
begin
/*检索游标数据*/
for v_1 in c_1 loop
/**根据‘|’拆分字符串,并匹配数据,如果存在然后1,否则继续循环*/
WHILE (v_start <= v_length) LOOP
v_index := INSTR(to_party_id, '|', v_start);
-- DBMS_OUTPUT.PUT_LINE('v_index:' || v_index);
IF v_index = 0 THEN
party_str := SUBSTR(to_party_id, v_start);
v_start := v_length + 1;
ELSE
party_str := SUBSTR(to_party_id, v_start, v_index - v_start);
v_start := v_index + 1;
END IF;
--DBMS_OUTPUT.PUT_LINE('party_str:' || party_str);
--DBMS_OUTPUT.PUT_LINE('party_id:' || v_1.party_id);
IF party_str = v_1.party_id then
return '1';
end if;
END LOOP;
/*重置循环条件*/
v_length := LENGTH(to_party_id);
v_start := 1;
end loop;
return '0';
end;