1.Discoverer administrator custom folder sql:
  select * from table(PIPE_EMP_MANAGER(USERENV('CLIENT_INFO')))
  也可以改用session level table

2.Discoverer desktop/plus worksheet condition
a. select folder with step 1 creation
b. add condition=> where 1=USERPARAM(:empno)
ps::empno 為parameter

3. create db function USERPARAM
CREATE OR REPLACE function USERPARAM(emp_no in varchar2)
RETURN NUMBER
is
begin
dbms_application_info.set_client_info(emp_no);
RETURN 1;
END;
/
ps:當然可以改成動態接受各種參數的function

 

4.create pipe function & object
ps:by case 依照需要自行定義
--員工record類型
CREATE OR REPLACE TYPE T_REC_EMPLOYEE AS object  
(
  UDM04_ID          NUMBER,
  COM_CODE          CHAR(3 BYTE),
  EMPNO             VARCHAR2(36 BYTE),
  CARDNO            VARCHAR2(36 BYTE),
  EMPNM             VARCHAR2(60 BYTE),
  ENAME             VARCHAR2(120 BYTE),
  DUDYSORT          VARCHAR2(18 BYTE),
  DUTYNAME          VARCHAR2(50 BYTE),
  DEPT_ID           NUMBER,
  DEPTNO            VARCHAR2(120 BYTE),
  DEPT_LV           NUMBER,
  DEPT_NAME         VARCHAR2(80 BYTE),
  DEPTNO_PATH       VARCHAR2(1000 BYTE),
  DEPTNM_PATH       VARCHAR2(1000 BYTE),  
  DEPT_ROOT_NO      VARCHAR2(20 BYTE),
  DEPT_ROOT_ID      NUMBER(12),
  MANAGER1_NO       VARCHAR2(20 BYTE),
  MANAGER2_NO       VARCHAR2(20 BYTE),
  MANAGER3_NO       VARCHAR2(20 BYTE),
  MANAGER_NO_PATH   VARCHAR2(1000 BYTE),
  MANAGER2_NO_PATH  VARCHAR2(1000 BYTE),
  MANAGER3_NO_PATH  VARCHAR2(1000 BYTE),
  DEPT_OBJID_PATH   VARCHAR2(1000 BYTE),
  BIRTHDAY          DATE,
  MAIL              VARCHAR2(80 BYTE),
  SEX               VARCHAR2(1 BYTE),
  MARRY             VARCHAR2(18 BYTE),
  RS_IN             DATE,
  DEBZ              VARCHAR2(18 BYTE),
  BZNAME            VARCHAR2(16 BYTE),
  ZHIWU             VARCHAR2(18 BYTE),
  ZWNAME            VARCHAR2(120 BYTE),
  ZHIJI             VARCHAR2(18 BYTE),
  ZJNAME            VARCHAR2(12 BYTE),
  LZDATE            DATE,
  LZCODE            VARCHAR2(40 BYTE),
  LZCAUSE           VARCHAR2(30 BYTE)
)

--員工類型集合
CREATE OR REPLACE TYPE COL_EMPLOYEE AS TABLE OF T_REC_EMPLOYEE
/

 

 

-- 主要pipe function
CREATE OR REPLACE FUNCTION PIPE_EMP_MANAGER (
/*==========================================================================+
  此pipe function 為尋找某員工之部門主管資料,可循序往該部門部門層級上階進行巡訪,
  且可指定公司,部門名稱,職務,部門層級 等相關參數作為模糊及等值定義搜尋條件,
  若人事系統部門資料未定義部門主管,無法取得任何主管筆數,
  則會再次尋找員工部門代號列於˙該員工上階所有部門階層資料中的員工
  參數說明:
   pempno      IN VARCHAR2,                --員工工號
   pcom_code   IN VARCHAR2 DEFAULT NULL ,  --公司code , 金橋=GBE ,達辰=DDE
   pdept_lv    IN NUMBER DEFAULT NULL ,    --部門階級,pdept_lv 以上的部門層級主管才會抓取
   pjob        IN VARCHAR2 DEFAULT NULL ,  --主管職務說明,可用模糊搜尋% or _
   pdeptname   IN VARCHAR2 DEFAULT NULL    --主管部門名稱,可用模糊搜尋% or _
   Revision 1.0
          Nolem lin    creation
|                                                                           |
+==========================================================================*/
   pempno      IN VARCHAR2,                                    
   pcom_code   IN VARCHAR2 DEFAULT NULL ,     
   pdept_lv    IN NUMBER DEFAULT NULL ,
   pjob        IN VARCHAR2 DEFAULT NULL ,   
   pdeptname   IN VARCHAR2 DEFAULT NULL     
)
   RETURN COL_EMPLOYEE
   PIPELINED
AS
   rec_employee    MV_ALL_EMPLOYEE%ROWTYPE;
   manager_cnt     PLS_INTEGER := 0;
   manager_where   VARCHAR2 (1000) := NULL;
   deptid_where    VARCHAR2 (1000) := NULL;
   vsql            VARCHAR2 (1000) := NULL;
recrow T_REC_EMPLOYEE :=T_REC_EMPLOYEE(null,null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null);  
recempty T_REC_EMPLOYEE :=T_REC_EMPLOYEE(null,null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null,
null,null,null,null,null,null,null,null,null);
   TYPE t_managerlist IS TABLE OF MV_ALL_EMPLOYEE%ROWTYPE;

   managerlist     t_managerlist;
   inx1            PLS_INTEGER;
BEGIN
   BEGIN
      SELECT   *
        INTO   rec_employee
        FROM   MV_ALL_EMPLOYEE
       WHERE   empno = pempno;

      IF TRIM (rec_employee.MANAGER_NO_PATH) IS NOT NULL
      THEN
         manager_where :=
            manager_where || '\' || TRIM (rec_employee.MANAGER_NO_PATH);
      END IF;

      IF TRIM (rec_employee.MANAGER2_NO_PATH) IS NOT NULL
      THEN
         manager_where :=
            manager_where || '\' || TRIM (rec_employee.MANAGER2_NO_PATH);
      END IF;

      IF TRIM (rec_employee.MANAGER3_NO_PATH) IS NOT NULL
      THEN
         manager_where :=
            manager_where || '\' || TRIM (rec_employee.MANAGER3_NO_PATH);
      END IF;

      manager_where :=
       '('''
         || REPLACE (LTRIM (LTRIM (manager_where, '\'), ','), '\', ''',''')
         || ''')';
      vsql :=
         'SELECT * FROM MV_ALL_EMPLOYEE WHERE lzdate is null and empno in ';
      vsql := vsql || manager_where;

      IF pcom_code IS NOT NULL
      THEN
         vsql := vsql || ' and com_code=''' || pcom_code || '''';
      END IF;

      IF pdept_lv IS NOT NULL
      THEN
         vsql := vsql || ' and DEPT_LV<=' || pdept_lv;
      END IF;

      IF pjob IS NOT NULL
      THEN
         vsql := vsql || ' and ZWNAME like ''' || pjob || '''';
      END IF;

      IF pdeptname IS NOT NULL
      THEN
         vsql := vsql || ' and DEPTNM_PATH like ''' || pdeptname || '''';
      END IF;

      --  SYS.DBMS_OUTPUT.PUT_LINE(vsql);
      EXECUTE IMMEDIATE vsql BULK COLLECT INTO   managerlist;

      FOR inx1 IN 1 .. managerlist.COUNT
      LOOP
         recrow.UDM04_ID := managerlist (inx1).UDM04_ID;
         recrow.COM_CODE := managerlist (inx1).COM_CODE;
         recrow.EMPNO := managerlist (inx1).EMPNO;
         recrow.CARDNO := managerlist (inx1).CARDNO;
         recrow.EMPNM := managerlist (inx1).EMPNM;
         recrow.ENAME := managerlist (inx1).ENAME;
         recrow.DUDYSORT := managerlist (inx1).DUDYSORT;
         recrow.DUTYNAME := managerlist (inx1).DUTYNAME;
         recrow.DEPTNO := managerlist (inx1).DEPTNO;
         recrow.DEPT_LV := managerlist (inx1).DEPT_LV;
         recrow.DEPT_NAME := managerlist (inx1).DEPT_NAME;
         recrow.DEPTNO_PATH := managerlist (inx1).DEPTNO_PATH;
         recrow.DEPTNM_PATH := managerlist (inx1).DEPTNM_PATH;
         recrow.MANAGER1_NO := managerlist (inx1).MANAGER1_NO;
         recrow.DEPT_ROOT_NO := managerlist (inx1).DEPT_ROOT_NO;
         recrow.DEPT_ROOT_ID := managerlist (inx1).DEPT_ROOT_ID;
         recrow.MANAGER2_NO := managerlist (inx1).MANAGER2_NO;
         recrow.MANAGER3_NO := managerlist (inx1).MANAGER3_NO;
         recrow.MANAGER_NO_PATH := managerlist (inx1).MANAGER_NO_PATH;
         recrow.MANAGER2_NO_PATH := managerlist (inx1).MANAGER2_NO_PATH;
         recrow.MANAGER3_NO_PATH := managerlist (inx1).MANAGER3_NO_PATH;
         recrow.DEPT_OBJID_PATH := managerlist (inx1).DEPT_OBJID_PATH;
         recrow.BIRTHDAY := managerlist (inx1).BIRTHDAY;
         recrow.MAIL := managerlist (inx1).MAIL;
         recrow.SEX := managerlist (inx1).SEX;
         recrow.MARRY := managerlist (inx1).MARRY;
         recrow.RS_IN := managerlist (inx1).RS_IN;
         recrow.DEBZ := managerlist (inx1).DEBZ;
         recrow.BZNAME := managerlist (inx1).BZNAME;
         recrow.ZHIWU := managerlist (inx1).ZHIWU;
         recrow.ZWNAME := managerlist (inx1).ZWNAME;
         recrow.ZHIJI := managerlist (inx1).ZHIJI;
         recrow.ZJNAME := managerlist (inx1).ZJNAME;
         recrow.LZDATE := managerlist (inx1).LZDATE;
         recrow.LZCODE := managerlist (inx1).LZCODE;
         recrow.LZCAUSE := managerlist (inx1).LZCAUSE;
         PIPE ROW (recrow);
         manager_cnt := manager_cnt + 1;
      --DBMS_OUTPUT.PUT_LINE (managerlist(inx1).empno);
      END LOOP;

      IF manager_cnt = 0
      THEN
         vsql := NULL;
         vsql := 'SELECT * FROM MV_ALL_EMPLOYEE WHERE lzdate is null and DEPT_ID in ';
         manager_where := '('|| REPLACE (LTRIM (LTRIM (rec_employee.DEPT_OBJID_PATH, '\'), ','),'\',',')|| ')';  
         vsql := vsql || manager_where;

         IF pcom_code IS NOT NULL
         THEN
            vsql := vsql || ' and com_code=''' || pcom_code || '''';
         END IF;

         IF pdept_lv IS NOT NULL
         THEN
            vsql := vsql || ' and DEPT_LV<=' || pdept_lv;
         END IF;

         IF pjob IS NOT NULL
         THEN
            vsql := vsql || ' and ZWNAME like ''' || pjob || '''';
         END IF;

         IF pdeptname IS NOT NULL
         THEN
            vsql := vsql || ' and DEPTNM_PATH like ''' || pdeptname || '''';
         END IF;



         --  SYS.DBMS_OUTPUT.PUT_LINE(vsql);
         EXECUTE IMMEDIATE vsql BULK COLLECT INTO   managerlist;

         FOR inx1 IN 1 .. managerlist.COUNT
         LOOP
            recrow.UDM04_ID := managerlist (inx1).UDM04_ID;
            recrow.COM_CODE := managerlist (inx1).COM_CODE;
            recrow.EMPNO := managerlist (inx1).EMPNO;
            recrow.CARDNO := managerlist (inx1).CARDNO;
            recrow.EMPNM := managerlist (inx1).EMPNM;
            recrow.ENAME := managerlist (inx1).ENAME;
            recrow.DUDYSORT := managerlist (inx1).DUDYSORT;
            recrow.DUDYSORT := managerlist (inx1).DUDYSORT;
            recrow.DUDYSORT := managerlist (inx1).DUDYSORT;
            recrow.DEPT_ID := managerlist (inx1).DEPT_ID;
            recrow.DEPTNO := managerlist (inx1).DEPTNO;
            recrow.DEPT_LV := managerlist (inx1).DEPT_LV;
            recrow.DEPT_NAME := managerlist (inx1).DEPT_NAME;
            recrow.DEPTNO_PATH := managerlist (inx1).DEPTNO_PATH;
            recrow.DEPTNM_PATH := managerlist (inx1).DEPTNM_PATH;
            recrow.MANAGER1_NO := managerlist (inx1).MANAGER1_NO;
            recrow.DEPT_ROOT_NO := managerlist (inx1).DEPT_ROOT_NO;
            recrow.DEPT_ROOT_ID := managerlist (inx1).DEPT_ROOT_ID;
            recrow.MANAGER2_NO := managerlist (inx1).MANAGER2_NO;
            recrow.MANAGER3_NO := managerlist (inx1).MANAGER3_NO;
            recrow.MANAGER_NO_PATH := managerlist (inx1).MANAGER_NO_PATH;
            recrow.MANAGER2_NO_PATH := managerlist (inx1).MANAGER2_NO_PATH;
            recrow.MANAGER3_NO_PATH := managerlist (inx1).MANAGER3_NO_PATH;
            recrow.DEPT_OBJID_PATH := managerlist (inx1).DEPT_OBJID_PATH;
            recrow.BIRTHDAY := managerlist (inx1).BIRTHDAY;
            recrow.MAIL := managerlist (inx1).MAIL;
            recrow.SEX := managerlist (inx1).SEX;
            recrow.MARRY := managerlist (inx1).MARRY;
            recrow.RS_IN := managerlist (inx1).RS_IN;
            recrow.DEBZ := managerlist (inx1).DEBZ;
            recrow.BZNAME := managerlist (inx1).BZNAME;
            recrow.ZHIWU := managerlist (inx1).ZHIWU;
            recrow.ZWNAME := managerlist (inx1).ZWNAME;
            recrow.ZHIJI := managerlist (inx1).ZHIJI;
            recrow.ZJNAME := managerlist (inx1).ZJNAME;
            recrow.LZDATE := managerlist (inx1).LZDATE;
            recrow.LZCODE := managerlist (inx1).LZCODE;
            recrow.LZCAUSE := managerlist (inx1).LZCAUSE;
            PIPE ROW (recrow);
            manager_cnt := manager_cnt + 1;
         --DBMS_OUTPUT.PUT_LINE (managerlist(inx1).empno);
         END LOOP;
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RAISE;
   END;
END;
/

arrow
arrow
    全站熱搜

    Nolem 發表在 痞客邦 留言(0) 人氣()