当前位置:Gxlcms > 数据库问题 > Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)

Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)

时间:2021-07-01 10:21:17 帮助过:4人阅读

CREATE OR REPLACE PACKAGE PACK_KPI_KERNEL IS 2 --定义多级数组 字符串 3 TYPE TSTRARRY IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER; 4 5 TYPE TSTRARRYARRY IS TABLE OF TSTRARRY INDEX BY BINARY_INTEGER; 6 7 TYPE TSTRARRYARRYARRY IS TABLE OF TSTRARRYARRY INDEX BY BINARY_INTEGER; 8 9 -- Author : D 10 -- Created : 2011 11 -- Purpose : KPI模块 绩效考核核心算法包 12 13 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记 14 PROCEDURE KERNEL_MASTER_CONTROL; 15 16 --自动获取绩效考核月份参数 默认为 本月上月的月份 17 FUNCTION GET_KPI_DATE RETURN VARCHAR2; 18 19 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记 20 PROCEDURE KT_MAIN_MASTER_CONTROL(as_KEY IN VARCHAR2, as_flag IN VARCHAR2); 21 22 --计算 量化指标 单项得分 体系ID BODATA 23 FUNCTION GET_ONETARGET_SCORE(as_TARSYS_id IN VARCHAR2, as_bodata NUMBER) 24 RETURN NUMBER; 25 26 --计算 量化指标 单项有自变量 得分 体系ID BODATA 27 FUNCTION GET_ONETARGET_SCORE_VAR(as_TARSYS_id IN VARCHAR2, 28 as_bodata NUMBER) RETURN NUMBER; 29 30 --计算量化月奖 每日 31 PROCEDURE GET_BORESULT_LH_AWORD_TODAY; 32 33 --建立System_P_ID二维数组 34 FUNCTION Get_KPI_System_P_ID(as_target_id IN VARCHAR2) RETURN TSTRARRY; 35 36 --建立SystemID二维数组 37 FUNCTION Get_KPI_SystemID(as_target_id IN VARCHAR2) RETURN TSTRARRYARRY; 38 39 --计算量化月奖 40 FUNCTION GetComAword(as_KPI_SCORE IN number, as_CATALOG_ID IN VARCHAR2) 41 RETURN NUMBER; 42 43 --计算总月奖 44 FUNCTION Get_all_Aword(as_LH_SCORE IN number, as_GL_SCORE IN NUMBER) 45 RETURN NUMBER; 46 47 --获取指标的bodata2 48 FUNCTION Get_bodata2_kpi_flu_record(as_target_id IN VARCHAR2, 49 as_month IN VARCHAR2) RETURN NUMBER; 50 51 --部门得分修正 52 FUNCTION Get_K_DEP_DATA(as_dep_id IN VARCHAR2, as_month IN VARCHAR2) 53 RETURN NUMBER; 54 55 --指标单项得分修正 56 FUNCTION get_lh_score_fix(LH_score IN NUMBER, 57 dep_id IN NUMBER, 58 as_month IN VARCHAR2) RETURN NUMBER; 59 60 --取得资金计划准确率 61 FUNCTION get_zjjhzql(as_dep_id IN VARCHAR2, as_month IN VARCHAR2) 62 RETURN NUMBER; 63 64 --定时取指标元素 主程序 小元素合成算法 65 --=-=-==-=-=-=-=------------------------------- 66 PROCEDURE BOELEMENT_MASTER_CONTROL(as_date IN VARCHAR2); 67 68 --取值 69 --=-=-==-=-=-=-=------------------------------- 70 FUNCTION GET_BOELEMENT(as_ele_id IN VARCHAR2, as_date IN VARCHAR2) 71 RETURN NUMBER; 72 73 --取值 74 --=-=-==-=-=-=-=------------------------------- 75 FUNCTION kpi_splitelementex(P_STRING IN VARCHAR2, as_date IN VARCHAR2) 76 return NUMBER; 77 --取值 78 --=-=-==-=-=-=-=------------------------------- 79 FUNCTION kpi_splitelementgetrs(as_V_POS IN VARCHAR2, as_date IN VARCHAR2) 80 return VARCHAR2; 81 82 --根据指标公式,得出指标的实际值和计划值 83 --=-=-==-=-=-=-=------------------------------- 84 PROCEDURE KERNEL_TARGET_DATA_MAIN(AS_MONTH IN VARCHAR2); 85 86 procedure KPI_VIEW_TARGET; --集团指标取数 87 88 /*procedure Insert_JHZ_ToJHFluTable(as_date IN VARCHAR2); 89 procedure InsertOne_JHZ_ToJHFluTable(as_TARGET_ID in varchar2, 90 as_VALUE_PLAN in varchar2, 91 as_VALUE_DATA in varchar2, 92 as_REC_REASON in varchar2, 93 as_REC_MONTH in varchar2); 94 95 procedure kpi_BackToELeResultTable(as_date in varchar2); 96 */ 97 98 --计算量化月奖 99 FUNCTION Get_OneTarget_Score_NEW(as_TARSYS_id IN VARCHAR2, 100 as_bodata NUMBER) RETURN NUMBER; 101 PROCEDURE KERNEL_TARGET_ALL_XS(AS_YEAR IN VARCHAR2); 102 procedure KPI_LR_SJ_PM(as_month varchar2); 103 procedure KPI_LR_YSZQL_PM(as_month varchar2); 104 END PACK_KPI_KERNEL; 105 / 106 CREATE OR REPLACE PACKAGE BODY PACK_KPI_KERNEL IS 107 type My_Cursor is ref cursor; 108 109 ARRY1 TSTRARRY; 110 ARRY2 TSTRARRYARRY; 111 ARRY3 TSTRARRYARRYARRY; 112 113 --==================================================================== 114 --主控制,控制元素合成和指标计算,缺BO部分 115 PROCEDURE KERNEL_MASTER_CONTROL AS 116 ls_YF VARCHAR2(10); 117 ln_RESULT NUMBER; 118 119 BEGIN 120 121 DBMS_OUTPUT.ENABLE(10000000); 122 --DBMS_OUTPUT.ENABLE( buffer_size =>Null ); 123 124 BEGIN 125 /* insert into kpi_test2 values(to_char(sysdate,‘yyyy-mm-dd hh:mi:ss‘)); 126 commit;*/ 127 128 ls_YF := GET_KPI_DATE(); 129 130 --取计划值 131 PACK_KPI_JHZ.KPI_GET_JHZ_BYDAY(‘‘); 132 133 DBMS_OUTPUT.put_line(检查点1-1); 134 --小元素取值,小元素合成大元素,kpi_manager_boelement ---> kpi_manager_boelement_result 135 BOELEMENT_MASTER_CONTROL(ls_YF); 136 DBMS_OUTPUT.put_line(检查点1-2); 137 --根据指标公式,计算指标计划值和实际值 138 139 KERNEL_TARGET_DATA_MAIN(ls_YF); 140 DBMS_OUTPUT.put_line(检查点1-3); 141 --指标计划值,实际值取值,计算指标得分,kpi_manager_boresult ---> kpi_manager_boresult_report 142 KT_MAIN_MASTER_CONTROL(ls_YF, 0); 143 DBMS_OUTPUT.put_line(检查点1-4); 144 --第二次计算 145 BOELEMENT_MASTER_CONTROL(ls_YF); 146 DBMS_OUTPUT.put_line(检查点2-1); 147 KERNEL_TARGET_DATA_MAIN(ls_YF); 148 149 DBMS_OUTPUT.put_line(检查点2-2); 150 KT_MAIN_MASTER_CONTROL(ls_YF, 0); 151 152 DBMS_OUTPUT.put_line(检查点2-3); 153 --运行日志 154 pack_kpi_base.SET_SYSTEM_LOG(核心任务成功!, 被计算月份 || ls_YF); 155 156 /* if to_number(to_char(SYSDATE, ‘dd‘))=15 then 157 Insert_JHZ_ToJHFluTable(ls_YF); 158 end if;*/ 159 160 DBMS_OUTPUT.disable(); 161 EXCEPTION 162 WHEN OTHERS THEN 163 --运行日志 164 pack_kpi_base.SET_SYSTEM_LOG(核心任务失败!, 165 被计算月份 || ls_YF || Sqlerrm(Sqlcode)); 166 END; 167 168 END KERNEL_MASTER_CONTROL; 169 170 --==================================================================== 171 172 --==================================================================== 173 --自动获取绩效考核月份参数 默认为 本月上月的月份 174 FUNCTION GET_KPI_DATE RETURN VARCHAR2 AS 175 176 ls_kpi_date VARCHAR2(10); 177 day number; 178 179 BEGIN 180 day := to_number(to_char(SYSDATE, dd)); 181 182 if day < 20 then 183 ls_kpi_date := to_char(pack_kpi_base.F_GET_SYM(to_char(SYSDATE, 184 yyyymm)), 185 yyyy-mm); 186 187 -- ls_kpi_date := ‘2012-12‘; 188 else 189 ls_kpi_date := to_char(SYSDATE, yyyy-mm); 190 --ls_kpi_date := ‘2012-01‘; 191 end if; 192 193 RETURN ls_kpi_date; 194 195 END GET_KPI_DATE; 196 197 --==================================================================== 198 199 --================================================================================= 200 --==================================================================== 201 202 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记 0 是自动指标计算 1 是用户自定义计算 203 PROCEDURE KT_MAIN_MASTER_CONTROL(as_KEY IN VARCHAR2, as_flag IN VARCHAR2) IS 204 205 ls_key VARCHAR2(4000); 206 ls_flag VARCHAR2(10); 207 208 --游标取值 209 Cursor Cur_BO Is 210 SELECT t1.id, --主键 211 t1.t_id, 212 t1.target_id, 213 t1.target_code, 214 t1.target_name, 215 t1.tarsys_id, 216 t1.standardvalue, --标准值 217 t1.RATIO, --预测值 218 --2011-10-08 修改四舍五入 219 round(t1.BODATA, 4) BODATA, --指标分值 当月累计数 220 t1.bodata2, 221 t1.bodate 222 From kpi_manager_boresult_temp t1 223 -- where t1.target_id=38568 224 ; 225 226 -- 227 ln_ID NUMBER; 228 ls_T_ID VARCHAR2(4000); 229 ls_TARGET_ID VARCHAR2(4000); 230 ls_TARGET_CODE VARCHAR2(4000); 231 ls_TARGET_NAME VARCHAR2(4000); 232 ls_tarsys_id VARCHAR2(4000); 233 ls_STANDARDVALUE VARCHAR2(4000); 234 ls_RATIO VARCHAR2(4000); 235 ls_BODATA NUMBER; --实际值 236 ls_BODATA2 NUMBER; 237 ls_BODATE VARCHAR2(4000); 238 239 ls_realvalue number; --实际值=ls_BODATA 240 -- 241 ln_i NUMBER; 242 ln_industry90001 NUMBER; 243 ln_industry90002 NUMBER; 244 ln_ALL_BEST NUMBER; 245 ln_HISTORY_BEST NUMBER; 246 247 --分数计算部分变量 248 ln_industry NUMBER; 249 resScore NUMBER; 250 resScoreYSZQL NUMBER; 251 --ln_score NUMBER; 252 Ln_TARSYS_TYPE NUMBER; 253 ln_TARSYS_SCORE_TYPE NUMBER; --体系得分算法体系,重要用于判断分支 254 255 ln_K_DEP_DATA NUMBER; --部门指标修正系数 256 ln_CXD_SCORE NUMBER; --创新度得分 257 ln_WDD_SCORE NUMBER; --稳定度的分 258 ln_NLD_SCORE NUMBER; --努力度得分 259 ln_YSZQL_SCROE NUMBER; --预算准确率得分 260 261 BEGIN 262 DBMS_OUTPUT.ENABLE(10000000); 263 264 --参数处理 265 IF as_KEY IS NULL THEN 266 ls_key := GET_KPI_DATE(); 267 ELSE 268 ls_key := as_KEY; 269 END IF; 270 271 IF as_flag IS NULL THEN 272 ls_flag := 0; 273 ELSE 274 ls_flag := as_flag; 275 END IF; 276 277 --test 278 DBMS_OUTPUT.PUT_LINE(0、 装填原始数据 、参数 主键 = || ls_key || 279 计算类型 0 自动计算 1 用户计算= ls_flag = || ls_flag); 280 281 --================================================== 282 --第一部分 完成待计算数据处理 根据flag 283 --================================================== 284 285 --测试时候注释掉保留中间结果 286 DELETE FROM kpi_manager_boresult_temp; 287 COMMIT; 288 289 --ls_flag = 0 每日计算 290 IF ls_flag = 0 THEN 291 292 INSERT INTO kpi_manager_boresult_temp 293 294 (ID, 295 T_ID, 296 TARGET_ID, 297 TARGET_CODE, 298 TARGET_NAME, 299 tarsys_id, 300 STANDARDVALUE, 301 RATIO, 302 BODATA, 303 BODATA2, 304 BODATE, 305 JS_DATE) 306 SELECT rownum, 307 t.BORESULTID, 308 t.TARGET_ID, 309 NULL, 310 t.TARGET_NAME, 311 tt.tarsys_id, 312 t.STANDARDVALUE, 313 t.RATIO, 314 t.BODATA, 315 t.bodata2, 316 to_char(t.BOGETDATE, yyyy-mm), 317 SYSDATE 318 FROM kpi_kernel_boresult_v t, kpi_kpimodel_tst tt 319 WHERE t.TARGET_ID = tt.target_id 320 --and t.target_id=‘38568‘ 321 ; 322 COMMIT; 323 324 END IF; 325 326 --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 327 --ls_flag = 1 用户自定义计算 328 IF ls_flag = 1 THEN 329 330 INSERT INTO kpi_manager_boresult_temp 331 332 (ID, 333 T_ID, 334 TARGET_ID, 335 TARGET_CODE, 336 TARGET_NAME, 337 tarsys_id, 338 STANDARDVALUE, 339 RATIO, 340 BODATA, 341 BODATA2, 342 BODATE, 343 JS_DATE) 344 SELECT rownum, 345 t.rec_id, 346 t.target_id, --指标ID 347 ‘‘, 348 tt.target_name, --指标名字 349 tt.tarsys_id, 350 -- pack_kpi_base.F_GET_standardvalue(t.target_id) standardvalue, --标准值 351 352 pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id, 353 t.rec_date) standardvalue, 354 pack_kpi_base.F_GET_RATIO(t.target_id) PRE_RATIO, --预测值 355 t.BODATA, --指标分值 用户自行修改值 356 -- pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,to_char(to_date(t.rec_date,‘yyyy-mm-dd‘),‘yyyy-mm‘)) BODATA2, 357 pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id, 358 t.rec_date) BODATA2, 359 360 t.rec_date, --时间 361 SYSDATE 362 FROM kpi_flu_record t, kpi_kpimodel_tst tt 363 WHERE t.target_id = tt.target_id 364 AND t.rec_id = ls_key; 365 366 COMMIT; 367 368 END IF; 369 370 --================================================== 371 --第二部分 完成指标体系分值计算 372 --================================================== 373 374 --游标从统一接口取数 375 Open Cur_BO; 376 Fetch Cur_BO 377 INTO ln_ID, 378 ls_T_ID, 379 ls_TARGET_ID, 380 ls_TARGET_CODE, 381 ls_TARGET_NAME, 382 ls_tarsys_id, 383 ls_STANDARDVALUE, 384 ls_RATIO, 385 ls_BODATA, 386 ls_BODATA2, 387 ls_BODATE; 388 ln_i := 1; 389 --主循环 每次一个指标。 390 While Cur_BO%Found LOOP 391 --test 392 393 ln_i := ln_i + 1; 394 395 --循环每行 396 --根据指标类型编码 判断 是那个类型的指标 ,分别调用不同方法计算。并保存 397 --各项变量重新初始化 398 ln_industry := 99999; --创新度中间结果 399 ln_CXD_SCORE := 99999; --创新度 400 ln_WDD_SCORE := 99999; --稳定度的分 401 ln_NLD_SCORE := 99999; --努力度得分 402 ln_YSZQL_SCROE := 99999; --预算准确率得分 403 ln_K_DEP_DATA := 1; --部门得分修正系数 404 ln_TARSYS_SCORE_TYPE := -1; --默认为无效 405 ls_realvalue := ls_BODATA; --保存实际值 406 407 --通过判断实际值和计划值与指标是否是比值行还是普通型,确定是否进行计算 408 IF ((ls_BODATA IS NOT NULL) AND 409 pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = 0) OR 410 (pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = 1 AND 411 (ls_STANDARDVALUE IS NOT NULL) or 412 pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = 2) THEN 413 --第一类:普通型 414 IF pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = 0 THEN 415 416 ls_BODATA := ls_BODATA - ls_STANDARDVALUE; --跟计划值没关系 417 418 END IF; 419 --第二类:比值型 420 --bodata 综合处理 当 指标体系是比值型的时候,对bodata除以计划值得到率 421 IF pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id) = 1 THEN 422 423 IF ls_STANDARDVALUE = 0 THEN 424 --预测值等于0 或为空 预测值得分为100 否则执行 用分数除以预测值的比值 425 IF ls_BODATA = 0 THEN 426 ls_BODATA := 100; 427 END IF; 428 ELSE 429 ls_BODATA := round(ls_BODATA / ls_STANDARDVALUE, 4) * 100; 430 END IF

人气教程排行