Untitled

 avatar
unknown
plain_text
5 months ago
14 kB
3
Indexable
create FUNCTION DT_THOI_KHOA_BIEU_CUSTOM_NGHI_SEARCH_PAGE(pageNumber IN OUT NUMBER, pageSize IN OUT NUMBER,
                                                          filter IN STRING,
                                                          totalItem OUT NUMBER,
                                                          pageTotal OUT NUMBER) RETURN SYS_REFCURSOR
AS
    my_cursor              SYS_REFCURSOR;
    fromTime               STRING(50);
    toTime                 STRING(50);
    loaiHinhDaoTaoFilter   STRING(50);
    khoaSinhVienFilter     STRING(50);
    donViFilter            STRING(50);
    hocKy                  STRING(50);
    namHoc                 STRING(50);
    sortKey                STRING(20);
    sortMode               STRING(20);
    ks_maHocPhan           STRING(50);
    ks_tenMonHoc           STRING(100);
    ks_ngayNghi            STRING(50);
    ks_coSo                STRING(20);
    ks_phong               STRING(50);
    ks_thu                 STRING(50);
    ks_tiet                STRING(50);
    ks_userMod             STRING(50);
    ks_timeMod             NUMBER(20);
    ks_giangVien           STRING(100);
    ks_troGiang            STRING(100);
    ks_ghiChu              STRING(100);
    listKhoaSinhVienFilter STRING(1000);
    listHeFilter           STRING(1000);

BEGIN
    SELECT JSON_VALUE(filter, '$.hocKy') INTO hocKy FROM DUAL;
    SELECT JSON_VALUE(filter, '$.namHoc') INTO namHoc FROM DUAL;
    SELECT JSON_VALUE(filter, '$.fromTime') INTO fromTime FROM DUAL;
    SELECT JSON_VALUE(filter, '$.toTime') INTO toTime FROM DUAL;
    SELECT JSON_VALUE(filter, '$.loaiHinhDaoTaoFilter') INTO loaiHinhDaoTaoFilter FROM DUAL;
    SELECT JSON_VALUE(filter, '$.khoaSinhVienFilter') INTO khoaSinhVienFilter FROM DUAL;
    SELECT JSON_VALUE(filter, '$.donViFilter') INTO donViFilter FROM DUAL;
    SELECT JSON_VALUE(filter, '$.listHeFilter') INTO listHeFilter FROM DUAL;
    SELECT JSON_VALUE(filter, '$.listKhoaSinhVienFilter') INTO listKhoaSinhVienFilter FROM DUAL;

    SELECT JSON_VALUE(filter, '$.sortKey') INTO sortKey FROM DUAL;
    SELECT JSON_VALUE(filter, '$.sortMode') INTO sortMode FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_maHocPhanN') INTO ks_maHocPhan FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_tenMonHocN') INTO ks_tenMonHoc FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_coSoN') INTO ks_coSo FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_ngayNghiN') INTO ks_ngayNghi FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_phongN') INTO ks_phong FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_thuN') INTO ks_thu FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_tietN') INTO ks_tiet FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_userModN') INTO ks_userMod FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_timeModN') INTO ks_timeMod FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_giangVienN') INTO ks_giangVien FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_troGiangN') INTO ks_troGiang FROM DUAL;
    SELECT JSON_VALUE(filter, '$.ks_ghiChuN') INTO ks_ghiChu FROM DUAL;

    SELECT COUNT(*)
    INTO totalItem
    FROM DT_THOI_KHOA_BIEU_CUSTOM NGHI
    WHERE NGHI.IS_NGHI = 1
      AND NGHI.NGAY_HOC BETWEEN fromTime AND toTime;

    IF pageNumber < 1 THEN pageNumber := 1; END IF;
    IF pageSize < 1 THEN pageSize := 1; END IF;
    pageTotal := CEIL(totalItem / pageSize);
    pageNumber := LEAST(pageNumber, pageTotal);

    OPEN my_cursor FOR
        WITH CAN_BO AS (SELECT CBNT.SHCC                                                      AS "shcc",
                               UPPER(CBNT.HO) || ' ' || UPPER(CBNT.TEN) || '(' || 'TG' || ')' AS "hoTen",
                               DV.TEN                                                         AS "tenDonVi",
                               HOC_HAM.VIET_TAT || ' ' || TD.VIET_TAT                         AS "trinhDo",
                               CBNT.EMAIL                                                     AS "email"
                        FROM DT_CAN_BO_NGOAI_TRUONG CBNT
                                 LEFT JOIN DM_DON_VI DV
                                           on CBNT.DON_VI = DV.MA
                                 LEFT JOIN DM_TRINH_DO TD ON TD.MA = CBNT.TRINH_DO
                                 LEFT JOIN DM_CHUC_DANH_KHOA_HOC HOC_HAM ON CBNT.HOC_HAM = HOC_HAM.MA
                        UNION
                        SELECT CB.SHCC                                AS "shcc",
                               UPPER(CB.HO) || ' ' || UPPER(CB.TEN)   AS "hoTen",
                               DV.TEN                                 AS "tenDonVi",
                               HOC_HAM.VIET_TAT || ' ' || TD.VIET_TAT AS "trinhDo",
                               CB.EMAIL                               AS "email"
                        FROM TCHC_CAN_BO CB
                                 LEFT JOIN DM_NGACH_CDNN NGACH on CB.NGACH = NGACH.MA
                                 LEFT JOIN DM_DON_VI DV on CB.MA_DON_VI = DV.MA
                                 LEFT JOIN DM_TRINH_DO TD ON TD.MA = CB.HOC_VI
                                 LEFT JOIN DM_CHUC_DANH_KHOA_HOC HOC_HAM ON CB.CHUC_DANH = HOC_HAM.MA
                        WHERE CB.NGAY_NGHI IS NULL
                        ORDER BY "tenDonVi" nulls last)
        SELECT *
        FROM (SELECT NGHI.ID                                       AS        "id",
                     MH.TEN                                        AS        "tenMonHoc",
                     NGHI.MA_HOC_PHAN                              AS        "maHocPhan",
                     NGHI.CO_SO                                    AS        "coSo",
                     NGHI.NGAY_HOC                                 AS        "ngayNghi",
                     NGHI.THU                                      AS        "thu",
                     NGHI.TIET_BAT_DAU                             AS        "tietBatDau",
                     NGHI.SO_TIET_BUOI                             AS        "soTietBuoi",
                     NGHI.PHONG                                    AS        "phong",
                     NGHI.GHI_CHU                                  AS        "ghiChu",
                     NGHI.THOI_GIAN_BAT_DAU                        AS        "ngayBatDau",
                     NGHI.THOI_GIAN_KET_THUC                       AS        "ngayKetThuc",
                     NGHI.IS_HOAN_TAC                              AS        "isHoanTac",
                     REPLACE(NGHI.MODIFIER, '@hcmussh.edu.vn', '') AS        "userModified",
                     NGHI.TIME_MODIFIED                            AS        "timeModified",
                     GV.giangVien                                  AS        "giangVien",
                     GVI.troGiang                                   AS        "troGiang",
                     NGHI.IS_GIANG_VIEN_BAO_NGHI                   AS        "isGiangVienBaoNghi",
                     ROW_NUMBER() OVER (ORDER BY NGHI.THU, NGHI.MA_HOC_PHAN) R
              FROM DT_THOI_KHOA_BIEU_CUSTOM NGHI
                       LEFT JOIN DM_MON_HOC MH ON MH.MA = NGHI.MA_MON_HOC
                       LEFT JOIN (SELECT *
                                  FROM (SELECT MA_HOC_PHAN,
                                               KHOA_SINH_VIEN,
                                               KHOA_DANG_KY,
                                               LOAI_HINH_DAO_TAO,
                                               ROW_NUMBER() over (PARTITION BY MA_HOC_PHAN ORDER BY ID) AS R
                                        FROM DT_THOI_KHOA_BIEU)
                                  WHERE R = 1) TKB ON TKB.MA_HOC_PHAN = NGHI.MA_HOC_PHAN
                       LEFT JOIN (SELECT GV.ID_TUAN,
                                         LISTAGG(CAN_BO."trinhDo" || ' ' || CAN_BO."hoTen", ',')
                                                 WITHIN GROUP (ORDER BY NULL) AS giangVien
                                  FROM DT_THOI_KHOA_BIEU_GIANG_VIEN GV
                                           LEFT JOIN CAN_BO ON CAN_BO."shcc" = GV.GIANG_VIEN
                                  WHERE GV.TYPE = 'GV'
                                    AND NGAY_BAT_DAU IS NOT NULL
                                  GROUP BY GV.ID_TUAN) GV
                                 ON GV.ID_TUAN = NGHI.ID
                       LEFT JOIN (SELECT GV.ID_TUAN,
                                         LISTAGG(CAN_BO."trinhDo" || ' ' || CAN_BO."hoTen", ',')
                                                 WITHIN GROUP (ORDER BY NULL) AS troGiang
                                  FROM DT_THOI_KHOA_BIEU_GIANG_VIEN GV
                                           LEFT JOIN CAN_BO ON CAN_BO."shcc" = GV.GIANG_VIEN
                                  WHERE GV.TYPE = 'TG'
                                    AND NGAY_BAT_DAU IS NOT NULL
                                  GROUP BY GV.ID_TUAN) GVI
                                 ON GVI.ID_TUAN = NGHI.ID

              WHERE (NGHI.IS_NGHI = 1 OR NGHI.IS_HOAN_TAC = 1)
                AND NGHI.NGAY_HOC BETWEEN fromTime AND toTime
                AND (namHoc IS NULL OR NGHI.NAM_HOC = namHoc)
                AND (hocKy IS NULL OR NGHI.HOC_KY = hocKy)
                AND (loaiHinhDaoTaoFilter IS NULL OR TKB.LOAI_HINH_DAO_TAO = loaiHinhDaoTaoFilter)
                AND (khoaSinhVienFilter IS NULL OR TKB.KHOA_SINH_VIEN = khoaSinhVienFilter)
                AND (donViFilter IS NULL OR TKB.KHOA_DANG_KY = donViFilter)
                AND (
                      (ks_maHocPhan IS NULL OR lower(NGHI.MA_HOC_PHAN) LIKE ('%' || lower(ks_maHocPhan) || '%'))
                      AND (ks_tenMonHoc IS NULL OR lower(MH.TEN) LIKE ('%' || lower(ks_tenMonHoc) || '%'))
                      AND (ks_ngayNghi IS NULL OR NGHI.NGAY_HOC = ks_ngayNghi)
                      AND (ks_phong IS NULL OR NGHI.PHONG = ks_phong)
                      AND (ks_coSo IS NULL OR NGHI.CO_SO = ks_coSo)
                      AND (ks_thu IS NULL OR NGHI.THU = ks_thu)
                      AND (ks_tiet IS NULL OR
                           ks_tiet BETWEEN NGHI.TIET_BAT_DAU AND (NGHI.SO_TIET_BUOI + NGHI.TIET_BAT_DAU - 1))
                      AND (ks_userMod IS NULL OR lower(NGHI.MODIFIER) LIKE ('%' || lower(ks_userMod) || '%'))
                      AND (ks_timeMod IS NULL OR NGHI.TIME_MODIFIED = ks_timeMod)
                      AND (ks_giangVien IS NULL OR INSTR(LOWER(GV.giangVien), LOWER(ks_giangVien)) > 0)
                      AND (ks_troGiang IS NULL OR INSTR(LOWER(GVI.troGiang), LOWER(ks_troGiang)) > 0)
                      AND (ks_ghiChu IS NULL OR lower(NGHI.GHI_CHU) LIKE ('%' || lower(ks_ghiChu) || '%'))
                  )
                AND (listKhoaSinhVienFilter IS NULL OR
                     TKB.KHOA_SINH_VIEN IN (SELECT regexp_substr(listKhoaSinhVienFilter, '[^,]+', 1, level)
                                            from dual
                                            connect by regexp_substr(listKhoaSinhVienFilter, '[^,]+', 1, level) is not null))
                AND (listHeFilter IS NULL OR
                     TKB.LOAI_HINH_DAO_TAO IN (SELECT regexp_substr(listHeFilter, '[^,]+', 1, level)
                                               from dual
                                               connect by regexp_substr(listHeFilter, '[^,]+', 1, level) is not null))
              ORDER BY CASE
                           WHEN sortMode = 'ASC' THEN
                               DECODE(sortKey,
                                      'maHocPhan', NLSSORT(NGHI.MA_HOC_PHAN, 'NLS_SORT = BINARY_AI'),
                                      'tenMonHoc', NLSSORT(MH.TEN, 'NLS_SORT = VIETNAMESE'),
                                      'phong', NLSSORT(NGHI.PHONG, 'NLS_SORT = BINARY_AI'),
                                      'thu', NLSSORT(NGHI.THU, 'NLS_SORT = VIETNAMESE'),
                                      'tiet', NLSSORT(NGHI.TIET_BAT_DAU, 'NLS_SORT = BINARY_AI'),
                                      'ngayNghi', NLSSORT(NGHI.NGAY_HOC, 'NLS_SORT = BINARY_AI'),
                                      'userMod', NLSSORT(NGHI.MODIFIER, 'NLS_SORT = BINARY_AI'),
                                      'timeMod', NLSSORT(NGHI.TIME_MODIFIED, 'NLS_SORT = BINARY_AI'),
                                      NLSSORT(NGHI.MA_HOC_PHAN, 'NLS_SORT = BINARY_AI'))
                           END ASC NULLS LAST,

                       CASE
                           WHEN sortMode = 'DESC' THEN
                               DECODE(sortKey,
                                      'maHocPhan', NLSSORT(NGHI.MA_HOC_PHAN, 'NLS_SORT = BINARY_AI'),
                                      'tenMonHoc', NLSSORT(MH.TEN, 'NLS_SORT = VIETNAMESE'),
                                      'phong', NLSSORT(NGHI.PHONG, 'NLS_SORT = BINARY_AI'),
                                      'thu', NLSSORT(NGHI.THU, 'NLS_SORT = VIETNAMESE'),
                                      'tiet', NLSSORT(NGHI.TIET_BAT_DAU, 'NLS_SORT = BINARY_AI'),
                                      'userMod', NLSSORT(NGHI.MODIFIER, 'NLS_SORT = BINARY_AI'),
                                      'timeMod', NLSSORT(NGHI.TIME_MODIFIED, 'NLS_SORT = BINARY_AI'),
                                      NLSSORT(NGHI.MA_HOC_PHAN, 'NLS_SORT = BINARY_AI'))
                           END DESC NULLS LAST)
        WHERE R BETWEEN (pageNumber - 1) * pageSize + 1 AND pageNumber * pageSize;
    RETURN my_cursor;
END ;
/

Editor is loading...
Leave a Comment