一、计算出差得分的存储过程
CREATE OR REPLACE PROCEDURE QUERY.PR_ONBUSINESSSCORE
(
STARTTIMEINS IN varchar,
ENDTIMEINS IN varchar
) IS
startdata varchar2(80);
--出差开始时间
enddata varchar2(80);
--出差结束时间
starttimes varchar2(80);
--考核开始时间
endtimes varchar2(80);
--考核结束时间
outofXIANcity varchar2(80);
--判断是否西安市内的出差
scoreStartDate varchar2(80);
--用来计算实际出差天数的开始时间
scoreEndDate varchar2(80);
--用来计算实际出差天数的结束时间
SCORE_TIME varchar2(80);
--分数
isinsert varchar2(80);
--插入还是更新的判断条件
truedays varchar2(80);
--考核时间内的出差天数
username varchar(32);
--出差人员姓名
/******************************************************************************
计算出差得分的存储过程
计算规则
市外:在考核时间段内的真实出差天数 * 0.3 + 出差次数 * 0.7
市内:在考核时间段内的真实出差天数 * 0.1 + 出差次数 * 0.3
出差次数的计算方法:出差开始时间在考核时间段内,即考核时间段内的出差,次数累加得到。
******************************************************************************/
CURSOR cur_onbusiness IS select t.* from V_ONBUSINESS_NEW
t where t.duedate is not null;
--获得全部符合条件的出差记录
BEGIN
delete YWZKH_TRAVELPOINT where STARTTIME = to_date(STARTTIMEINS, 'yyyy-mm-dd');
starttimes := STARTTIMEINS;
--得到考核开始时间
if to_date(ENDTIMEINS, 'yyyy-mm-dd') > sysdate then
endtimes := to_char(sysdate, 'yyyy-mm-dd');
else
endtimes := ENDTIMEINS;
end if;
--得到考核结束时间
for cur_A in cur_onbusiness loop
--循环开始,循环整个出差记录表
username := cur_A.ASSIGNEE;
startdata := to_char(cur_A.duedate, 'yyyy-mm-dd');
--获得出差任务的开始时间
outofXIANcity := cur_A.ONBUSINESSTYPE;
--获得出差任务的名称判断是否是【出差】,若是,则是西安市外的出差,若不是,则是西安市内的出差
if startdata >= starttimes then
SCORE_TIME := 0.5;
else
SCORE_TIME := 0;
end if;
if cur_A.timeestimate is null then
--此参数为空即代表出差人还未回来,以考核结束时间作为计算实际出差天数的结束时间
scoreEndDate := ENDTIMEINS;
enddata := to_char(sysdate, 'yyyy-mm-dd');
else
--计算出差结束时间
select to_char((cur_A.duedate + (case ceil(cur_A.timeestimate) when 0 then 1 else ceil (cur_A.timeestimate) end)), 'yyyy-mm-dd') into enddata from dual;
if enddata > endtimes then
scoreEndDate := endtimes;
else
scoreEndDate := enddata;
end if;
--用较早的结束时间作为计算实际出差天数的结束时间
end if;
if startdata > starttimes then
scoreStartDate := startdata;
else
scoreStartDate := starttimes;
end if;
--用较晚的开始时间作为计算实际出差天数的开始时间
isinsert := null;
if scoreStartDate <= scoreEndDate then
if scoreStartDate <= to_char(sysdate, 'yyyy-mm-dd') then
dbms_output.put_line(cur_A.duedate||'!!!!!!'||scoreStartDate||'!!!!!!!!!!!!!!!!'||scoreEndDate);
dbms_output.put_line(username);
if scoreEndDate > to_char(sysdate, 'yyyy-mm-dd') then
scoreEndDate := to_char(sysdate, 'yyyy-mm-dd');
end if;
begin
select count(id) into isinsert from YWZKH_TRAVELPOINT where ID = cur_A.pkey and STARTTIME = to_date(STARTTIMEINS, 'yyyy-mm-dd') and endtime=to_date(ENDTIMEINS, 'yyyy-mm-dd');
if isinsert = '0' then
insert into YWZKH_TRAVELPOINT
(
ID, PrOJECT, REPORTER, ASSIGNEE, SUMMARY, DUEDATE, TIMEESTIMATE, ISSUESTATUS,
ENDDATE, STARTTIME, ENDTIME, CREATEDATE, SCORE_DAY, SCORE_TIMES, TRUETIME
)
values
(
cur_A.pkey, cur_A.project, cur_A.REPORTER, cur_A.ASSIGNEE, cur_A.SUMMARY, cur_A.DUEDATE,
cur_A.TIMEESTIMATE, cur_A.ISSUESTATUS, to_date(enddata, 'yyyy-mm-dd'), to_date(STARTTIMEINS, 'yyyy-mm-dd'), to_date(ENDTIMEINS, 'yyyy-mm-dd'),
sysdate, fun_getbusinessscore(outofXIANcity, scoreStartDate, scoreEndDate, enddata, cur_A.timeestimate), to_number(SCORE_TIME), to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd')
);
commit;
else
update YWZKH_TRAVELPOINT set SCORE_DAY = fun_getbusinessscore(outofXIANcity, scoreStartDate, scoreEndDate, enddata, cur_A.timeestimate), SCORE_TIMES = to_number(SCORE_TIME)
where ID = cur_A.pkey and STARTTIME = to_date(STARTTIMEINS, 'yyyy-mm-dd') and endtime=to_date(ENDTIMEINS, 'yyyy-mm-dd');
commit;
end if;
end;
update YWZKH_TRAVELPOINT set TRUEDAYS = SCORE_DAY / (case outofXIANcity when '市内' then 0.1 else 0.3 end)
where ID = cur_A.pkey and STARTTIME = to_date(STARTTIMEINS, 'yyyy-mm-dd') and endtime=to_date(ENDTIMEINS, 'yyyy-mm-dd');
end if;
end if;
end loop;
--循环结束
END PR_ONBUSINESSSCORE;
/
二、给时间维度表插入数据
CREATE OR REPLACE PROCEDURE Pr_Dw_Dim_Date_Data_Gen
(
beginYYYYMMDD NUMBER --开始日期
)
AS
beginDate DATE; --参数转换为日期后的结果
currentDate DATE ;--循环日期
v_CalHalfYear VARCHAR2(6) ;--在日历上属于“上半年”,还是“下半年”
v_StatHalfYear VARCHAR2(6) ;--在统计时属于“上半年”,还是“下半年”
v_CALQUARTER NUMBER ;--日历季度(1|2|3|4)
v_STATQUARTER NUMBER ;--日历季度(1|2|3|4)
v_CAL10DAYS VARCHAR2(6) ;--在日历上属于“上旬”,还是“中旬”、“下旬”
v_ISHOLIDAY VARCHAR2(2) :='否' ;--是否为节假日,公司规定每个双休日及法定假日为节假日
v_ISLAWHOLIDAY VARCHAR2(2) :='否' ;--是否为法定节假日�
i INT ;
maxRoomsizeLimit INTEGER;
curTClassID VARCHAR2(32);
v_errcode INTEGER;
v_errormsg VARCHAR2(200);
cc INTEGER :=0;
tmpVar NUMBER;
/******************************************************************************
给时间维度表插入数据
******************************************************************************/
BEGIN
BEGIN
beginDate :=TO_DATE(TO_CHAR(beginYYYYMMDD),'YYYY-MM-DD');
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
FOR i IN 0 .. 365*10 LOOP
currentDate := beginDate + i;
IF TO_NUMBER(TO_CHAR(currentDate,'MMDD'))<701 THEN
v_CalHalfYear :='上半年';
ELSE
v_CalHalfYear :='下半年';
END IF;
v_StatHalfYear:=v_CalHalfYear; ----先让它们相同
IF TO_NUMBER(TO_CHAR(currentDate,'MMDD'))<401 THEN --季度
v_CALQUARTER :=1;
ELSIF TO_NUMBER(TO_CHAR(currentDate,'MMDD'))<701 THEN
v_CALQUARTER :=2;
ELSIF TO_NUMBER(TO_CHAR(currentDate,'MMDD'))<1001 THEN
v_CALQUARTER :=3;
ELSE
v_CALQUARTER :=4;
END IF;
v_STATQUARTER:=v_CALQUARTER;
IF TO_NUMBER(TO_CHAR(currentDate,'DD'))<10 THEN
v_CAL10DAYS :='上旬';
ELSIF TO_NUMBER(TO_CHAR(currentDate,'DD'))<20 THEN
v_CAL10DAYS :='中旬';
ELSE
v_CAL10DAYS :='下旬';
END IF;
v_ISHOLIDAY :='否' ;--是否为节假日,公司规定每个双休日及法定假日为节假日
v_ISLAWHOLIDAY:='否' ;--是否为法定节假日� IF TO_NUMBER(TO_CHAR(currentDate,'D'))=1 OR
TO_NUMBER(TO_CHAR(currentDate,'D'))=7 THEN
v_ISHOLIDAY :='是';
END IF;
IF TO_NUMBER(TO_CHAR(currentDate,'MMDD'))=501 OR --五一
TO_NUMBER(TO_CHAR(currentDate,'MMDD'))=1001 OR --国庆节
TO_NUMBER(TO_CHAR(currentDate,'MMDD'))=1002 OR --国庆节
TO_NUMBER(TO_CHAR(currentDate,'MMDD'))=1003 OR --国庆节
TO_NUMBER(TO_CHAR(currentDate,'MMDD'))=101 OR --元旦
TO_NUMBER(TO_CHAR(currentDate,'MMDD'))=405 OR --清明(随是否润2月二不同,先这样写死吧)
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=107 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=106 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=105 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=104 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=103 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=102 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=101 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=1230 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=1229 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=1228 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=1227 OR --农历春节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=815 OR --农历中秋节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=505 OR --农历端午节
TO_NUMBER(TO_CHAR(F_Getlunar_Date(currentDate),'MMDD'))=1227 --农历春节
THEN
v_ISHOLIDAY :='是';
v_ISLAWHOLIDAY :='是';
END IF;
BEGIN
INSERT INTO DW_DIM_DATE (
DATEID, CALDATE, CALYEAR,
CALMONTH, CALDAY, CALHALFYEAR,
CALQUARTER, CALWEEK, CAL10DAYS,
CALYYYYMM, WEEKDAY, STATYEAR,
STATMONTH, STATDAY, STATYYYYMM,
ISSTATDAY, ISHOLIDAY, ISLAWHOLIDAY,
STATHALFYEAR, STATQUARTER)
VALUES (TO_NUMBER(TO_CHAR(currentDate,'YYYYMMDD')) ,currentDate ,TO_NUMBER(TO_CHAR(currentDate,'YYYY')) ,
TO_NUMBER(TO_CHAR(currentDate,'MM')) ,TO_NUMBER(TO_CHAR(currentDate,'DD')) ,v_CalHalfYear ,
v_CALQUARTER ,TO_NUMBER(TO_CHAR(currentDate,'WW')) ,v_CAL10DAYS ,
TO_NUMBER(TO_CHAR(currentDate,'YYYYMM')),DECODE(TO_NUMBER(TO_CHAR(currentDate,'D')),2,'星期一',3,'星期二',4,'星期三',5,'星期四',6,'星期五',7,'星期六','星期日') ,TO_NUMBER(TO_CHAR(currentDate,'YYYY')),
TO_NUMBER(TO_CHAR(currentDate,'MM')) ,TO_NUMBER(TO_CHAR(currentDate,'DD')) ,TO_NUMBER(TO_CHAR(currentDate,'YYYYMM')) ,
CASE WHEN TO_NUMBER(TO_CHAR(currentDate,'DD'))<>26 THEN '否' ELSE '是' END ,v_ISHOLIDAY , v_ISLAWHOLIDAY ,
v_StatHalfYear, v_STATQUARTER );
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
NULL;
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20003,SQLERRM);
END;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20003,SQLERRM);
/*
--******************************************************************************
作者:王峰
公司:长城数字软件
发布日期:2005-1-6
联系电话:887669825-862
--*******************************************************************************
*/
END Pr_Dw_Dim_Date_Data_Gen;
/
二、给工作量事实表插入数据
CREATE OR REPLACE PROCEDURE pr_dw_fact_workloadbyday (
currentyyyymmdd NUMBER --开始日期
)
AS
currentdate DATE; --循环日期
v_projectid NUMBER; --项目ID
v_staffaccount VARCHAR2 (32); --员工帐号
v_numberofpage1 NUMBER := 0;
v_numberofpage2 NUMBER := 0;
v_numberofpage3 NUMBER := 0;
v_numberofinterface1 NUMBER := 0;
v_numberofinterface2 NUMBER := 0;
v_numberofinterface3 NUMBER := 0;
v_numbersofalltask NUMBER := 0;
v_numbersofoverduetask NUMBER := 0;
v_hoursforplan NUMBER (10, 2) := 0;
v_hoursoffact NUMBER (10, 2) := 0;
CURSOR c2
IS
SELECT staffname, projectname, assignee
FROM dw_fact_workload
WHERE dateid = TO_NUMBER (TO_CHAR (currentdate - 1, 'YYYYMMDD'));
c1rec c2%ROWTYPE;
/******************************************************************************
统计工作量
******************************************************************************/
BEGIN
BEGIN
currentdate := TO_DATE (TO_CHAR (currentyyyymmdd), 'YYYY-MM-DD');
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END;
BEGIN
--按天统计2010-3-8以来每个人的D类bug数到 DW_FACT_BUG_D表中 --2011年3月31日,根据小王锋的要求将统计低级bug的方式由统计bug类型为"D类"改为"X类"
INSERT INTO dw_fact_bug_d
(dateid, staffname, bugtype, bugnum)
SELECT dateid, NVL (bugcreator, '不详') bugcreator, bugtype,
COUNT (*) bugnum
FROM (SELECT TO_NUMBER (TO_CHAR (currentdate - 1, 'YYYYMMDD')
) dateid,
issue.ID issue,
(SELECT NAME
FROM v_gds_user_from_asasa
WHERE empno = stringvalue) bugcreator,
'D类' bugtype
FROM (SELECT *
FROM customfieldvalue
WHERE customfield = 10061) customfieldvalue,
issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep, customfieldvalue
WHERE issuestatus = 6
AND os_currentstep.entry_id =
issue.workflow_id
AND issue.ID = customfieldvalue.issue
AND customfieldvalue.customfield = '10060'
AND created >
TO_DATE ('2010-03-08', 'YYYY-MM-DD')
AND customfieldvalue.stringvalue = 'X类') hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.ID = customfieldvalue.issue(+))
WHERE bugtype IS NOT NULL
GROUP BY dateid, bugcreator, bugtype;
END;
BEGIN --按天统计每个人的各类bug数到 DW_FACT_BUG表中
INSERT INTO dw_fact_bug
(dateid, staffname, bugtype, bugnum)
SELECT dateid, NVL (bugcreator, '不详') bugcreator, bugtype,
COUNT (*) bugnum
FROM (SELECT TO_NUMBER (TO_CHAR (currentdate - 1, 'YYYYMMDD')
) dateid,
customfieldvalue.issue,
(SELECT NAME
FROM v_gds_user_from_asasa
WHERE empno = stringvalue) bugcreator,
(SELECT stringvalue
FROM customfieldvalue
WHERE issue = issue.ID
AND customfieldvalue.customfield = 10060)
bugtype
FROM customfieldvalue,
issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE issuestatus = 6
AND os_currentstep.entry_id =
issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.ID = customfieldvalue.issue
AND customfieldvalue.customfield = 10061)
WHERE bugtype IS NOT NULL
GROUP BY dateid, bugcreator, bugtype;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END; --end ---按天统计每个人的各类bug数到 DW_FACT_BUG表中
BEGIN --按天统计每个项目的各类bug数到 DW_FACT_BUG_BY_PROJECT表中
INSERT INTO dw_fact_bug_by_project
(dateid, projectname, bugtype, bugnum)
SELECT dateid, projectname, bugtype, COUNT (*) bugnum
FROM (SELECT TO_NUMBER (TO_CHAR (currentdate - 1, 'YYYYMMDD')
) dateid,
customfieldvalue.issue,
(SELECT pname
FROM project
WHERE ID = issue.project) projectname,
(SELECT stringvalue
FROM customfieldvalue
WHERE issue = issue.ID
AND customfieldvalue.customfield = 10060)
bugtype
FROM customfieldvalue,
issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE issuestatus = 6
AND os_currentstep.entry_id =
issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.ID = customfieldvalue.issue
AND customfieldvalue.customfield = 10061)
WHERE bugtype IS NOT NULL
GROUP BY dateid, projectname, bugtype;
EXCEPTION
WHEN OTHERS
THEN
NULL;
END; --end -----按天统计每个项目的各类bug数到 DW_FACT_BUG_BY_PROJECT表中
BEGIN
--1、统计任务点数
INSERT INTO dw_fact_workload
(dateid, staffname, projectname, staffrole, staffdept,
staffgender, pointnumbersoftask, numberofpage1,
numberofpage2, numberofpage3, umbersofinterface1,
umbersofinterface2, umbersofinterface3, numbersofalltask,
numbersofoverduetask, hoursforplan, hoursoffact,
pointnumbers_businesstrip_task, assignee)
SELECT TO_NUMBER (TO_CHAR (currentdate - 1, 'YYYYMMDD')),
user.fullname,
NVL ((SELECT pname
FROM project
WHERE ID = stat.project), '不详') pname, '开发人员',
'开发部', '男', NVL (stat.workload, 0) nvl_workload, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, NVL (businesstrip_numbervalue, 0),
stat.assignee
FROM (SELECT assignee, issue.project,
SUM (numbervalue) workload
FROM (SELECT *
FROM customfieldvalue
WHERE customfield = 10050) customfieldvalue,
issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE (issuestatus = 6 OR issuestatus = 5)
AND os_currentstep.entry_id =
issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey(+)
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.ID = customfieldvalue.issue
GROUP BY assignee, issue.project) stat,
---added by zhangyp 20120409 计算出差点数 运维组考核使用
(SELECT assignee, issue.project,
SUM (numbervalue) businesstrip_numbervalue
FROM customfieldvalue,
issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE (issuestatus = 6 OR issuestatus = 5)
AND os_currentstep.entry_id =
issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND summary LIKE '【出差】%'
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1,
'YYYY-MM-DD'
)
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.ID = customfieldvalue.issue
AND customfieldvalue.customfield = 10050
GROUP BY assignee, issue.project) businesstrip_stat,
---added over by zhangyp 20120409 计算出差点数 运维组考核使用
(SELECT c.ID, c.username, a.propertyvalue fullname
FROM propertyentry b, propertystring a, userbase c
WHERE a.ID = b.ID
AND b.property_key = 'fullName'
AND b.entity_id = c.ID) user
WHERE stat.project = businesstrip_stat.project(+)
AND stat.assignee = businesstrip_stat.assignee(+)
AND stat.assignee = user.username
AND stat.project IS NOT NULL;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
END;
--2开始统计页面及接口数据
BEGIN
OPEN c2;
LOOP
FETCH c2
INTO c1rec;
<<nextstep>>
EXIT WHEN c2%NOTFOUND;
BEGIN
SELECT ID
INTO v_projectid
FROM project
WHERE pname = c1rec.projectname AND ROWNUM = 1; --得到项目ID
SELECT c.username
INTO v_staffaccount --得到员工帐号
FROM propertyentry b, propertystring a, userbase c
WHERE a.ID = b.ID
AND b.property_key = 'fullName'
AND b.entity_id = c.ID
AND a.propertyvalue = c1rec.staffname
AND ROWNUM = 1;
EXCEPTION
WHEN OTHERS
THEN
GOTO nextstep;
END;
/*closed by zhangyp 20120409
SELECT SUM(numbervalue) INTO v_numberOFPage1 --1统计某人在某个项目上某天完成的简单页面个数
FROM CUSTOMFIELDVALUE ,ISSUE,
(SELECT pKey, OS_CURRENTSTEP.STATUS, OS_CURRENTSTEP.START_DATE
FROM ISSUE, OS_CURRENTSTEP
WHERE ISSUESTATUS = 6 AND
OS_CURRENTSTEP.ENTRY_ID = ISSUE.WORKFLOW_ID
) hadClosedIssue
WHERE ISSUE.pKey=hadClosedIssue.pKey AND
hadClosedIssue.START_DATE>=TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') AND
hadClosedIssue.START_DATE<TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 23:59:59','YYYY-MM-DD HH24:MI:SS') AND
ISSUE.ID=CUSTOMFIELDVALUE.issue AND
ISSUE.PROJECT=V_PROJECTID AND
ISSUE.ASSIGNEE=V_STAFFACCOUNT AND
CUSTOMFIELDVALUE.CUSTOMFIELD=10002;
SELECT SUM(numbervalue) INTO v_numberOFPage2 --2统计某人在某个项目上某天完成的普通页面个数
FROM CUSTOMFIELDVALUE ,ISSUE,
(SELECT pKey, OS_CURRENTSTEP.STATUS, OS_CURRENTSTEP.START_DATE
FROM ISSUE, OS_CURRENTSTEP
WHERE ISSUESTATUS = 6 AND
OS_CURRENTSTEP.ENTRY_ID = ISSUE.WORKFLOW_ID
) hadClosedIssue
WHERE ISSUE.pKey=hadClosedIssue.pKey AND
hadClosedIssue.START_DATE>=TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') AND
hadClosedIssue.START_DATE<TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 23:59:59','YYYY-MM-DD HH24:MI:SS') AND
ISSUE.ID=CUSTOMFIELDVALUE.issue AND
ISSUE.PROJECT=V_PROJECTID AND
ISSUE.ASSIGNEE=V_STAFFACCOUNT AND
CUSTOMFIELDVALUE.CUSTOMFIELD=10001;
SELECT SUM(numbervalue) INTO v_numberOFPage3 --3统计某人在某个项目上某天完成的复杂页面个数
FROM CUSTOMFIELDVALUE ,ISSUE,
(SELECT pKey, OS_CURRENTSTEP.STATUS, OS_CURRENTSTEP.START_DATE
FROM ISSUE, OS_CURRENTSTEP
WHERE ISSUESTATUS = 6 AND
OS_CURRENTSTEP.ENTRY_ID = ISSUE.WORKFLOW_ID
) hadClosedIssue
WHERE ISSUE.pKey=hadClosedIssue.pKey AND
hadClosedIssue.START_DATE>=TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') AND
hadClosedIssue.START_DATE<TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 23:59:59','YYYY-MM-DD HH24:MI:SS') AND
ISSUE.ID=CUSTOMFIELDVALUE.issue AND
ISSUE.PROJECT=V_PROJECTID AND
ISSUE.ASSIGNEE=V_STAFFACCOUNT AND
CUSTOMFIELDVALUE.CUSTOMFIELD=10000;
SELECT SUM(numbervalue) INTO v_numberOFInterface1 --4统计某人在某个项目上某天完成的简单接口个数
FROM CUSTOMFIELDVALUE ,ISSUE,
(SELECT pKey, OS_CURRENTSTEP.STATUS, OS_CURRENTSTEP.START_DATE
FROM ISSUE, OS_CURRENTSTEP
WHERE ISSUESTATUS = 6 AND
OS_CURRENTSTEP.ENTRY_ID = ISSUE.WORKFLOW_ID
) hadClosedIssue
WHERE ISSUE.pKey=hadClosedIssue.pKey AND
hadClosedIssue.START_DATE>=TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') AND
hadClosedIssue.START_DATE<TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 23:59:59','YYYY-MM-DD HH24:MI:SS') AND
ISSUE.ID=CUSTOMFIELDVALUE.issue AND
ISSUE.PROJECT=V_PROJECTID AND
ISSUE.ASSIGNEE=V_STAFFACCOUNT AND
CUSTOMFIELDVALUE.CUSTOMFIELD=10005;
SELECT SUM(numbervalue) INTO v_numberOFInterface2 --5统计某人在某个项目上某天完成的普通接口个数
FROM CUSTOMFIELDVALUE ,ISSUE,
(SELECT pKey, OS_CURRENTSTEP.STATUS, OS_CURRENTSTEP.START_DATE
FROM ISSUE, OS_CURRENTSTEP
WHERE ISSUESTATUS = 6 AND
OS_CURRENTSTEP.ENTRY_ID = ISSUE.WORKFLOW_ID
) hadClosedIssue
WHERE ISSUE.pKey=hadClosedIssue.pKey AND
hadClosedIssue.START_DATE>=TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') AND
hadClosedIssue.START_DATE<TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 23:59:59','YYYY-MM-DD HH24:MI:SS') AND
ISSUE.ID=CUSTOMFIELDVALUE.issue AND
ISSUE.PROJECT=V_PROJECTID AND
ISSUE.ASSIGNEE=V_STAFFACCOUNT AND
CUSTOMFIELDVALUE.CUSTOMFIELD=10004;
SELECT SUM(numbervalue) INTO v_numberOFInterface3 --6统计某人在某个项目上某天完成的复杂接口个数
FROM CUSTOMFIELDVALUE ,ISSUE,
(SELECT pKey, OS_CURRENTSTEP.STATUS, OS_CURRENTSTEP.START_DATE
FROM ISSUE, OS_CURRENTSTEP
WHERE ISSUESTATUS = 6 AND
OS_CURRENTSTEP.ENTRY_ID = ISSUE.WORKFLOW_ID
) hadClosedIssue
WHERE ISSUE.pKey=hadClosedIssue.pKey AND
hadClosedIssue.START_DATE>=TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 00:00:00','YYYY-MM-DD HH24:MI:SS') AND
hadClosedIssue.START_DATE<TO_DATE(TO_CHAR(currentDate -1,'YYYY-MM-DD')||' 23:59:59','YYYY-MM-DD HH24:MI:SS') AND
ISSUE.ID=CUSTOMFIELDVALUE.issue AND
ISSUE.PROJECT=V_PROJECTID AND
ISSUE.ASSIGNEE=V_STAFFACCOUNT AND
CUSTOMFIELDVALUE.CUSTOMFIELD=10003;
----closed by zhangyp 20120409*/------------------------------以下四个指标待求-----------------------------------------------------------------
--2.1V_NUMBERSOFALLTASK
SELECT COUNT (*)
INTO v_numbersofalltask
--6统计某人在某个项目上某天完成的任务及子任务个数(逾期和按期的都算)
FROM issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE (issuestatus = 6 OR issuestatus = 5)
AND os_currentstep.entry_id = issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1, 'YYYY-MM-DD')
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1, 'YYYY-MM-DD')
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.project = v_projectid
AND issue.assignee = v_staffaccount;
--2.2V_NUMBERSOFOVERDUETASK
SELECT COUNT (*)
INTO v_numbersofoverduetask
--6统计某人在某个项目上某天完成的任务及子任务个数(只算逾期的)
FROM issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE (issuestatus = 6 OR issuestatus = 5)
AND os_currentstep.entry_id = issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1, 'YYYY-MM-DD')
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1, 'YYYY-MM-DD')
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.duedate IS NOT NULL
AND hadclosedissue.start_date >
TO_DATE ( TO_CHAR (issue.duedate, 'YYYY-MM-DD')
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.project = v_projectid
AND issue.assignee = v_staffaccount;
--2.3V_HOURSFORPLAN
SELECT ROUND (SUM (timeoriginalestimate) / 3600),
ROUND (SUM (timespent) / 3600)
INTO v_hoursforplan,
v_hoursoffact
--6统计某人在某个项目上某天完成的任务及子任务的总计估算时间和实际工作时间
FROM issue,
(SELECT pkey, os_currentstep.status,
os_currentstep.start_date
FROM issue, os_currentstep
WHERE (issuestatus = 6 OR issuestatus = 5)
AND os_currentstep.entry_id = issue.workflow_id) hadclosedissue
WHERE issue.pkey = hadclosedissue.pkey
AND hadclosedissue.start_date >=
TO_DATE ( TO_CHAR (currentdate - 1, 'YYYY-MM-DD')
|| ' 00:00:00',
'YYYY-MM-DD HH24:MI:SS'
)
AND hadclosedissue.start_date <
TO_DATE ( TO_CHAR (currentdate - 1, 'YYYY-MM-DD')
|| ' 23:59:59',
'YYYY-MM-DD HH24:MI:SS'
)
AND issue.project = v_projectid
AND issue.assignee = v_staffaccount;
-----99更新统计指标---------------------------------------------------------------------------------------------
UPDATE dw_fact_workload
SET numberofpage1 = NVL (v_numberofpage1, 0),
numberofpage2 = NVL (v_numberofpage2, 0),
numberofpage3 = NVL (v_numberofpage3, 0),
umbersofinterface1 = NVL (v_numberofinterface1, 0),
umbersofinterface2 = NVL (v_numberofinterface2, 0),
umbersofinterface3 = NVL (v_numberofinterface3, 0),
numbersofalltask = NVL (v_numbersofalltask, 0),
numbersofoverduetask = NVL (v_numbersofoverduetask, 0),
hoursforplan = NVL (v_hoursforplan, 0),
hoursoffact = NVL (v_hoursoffact, 0)
WHERE dateid = TO_NUMBER (TO_CHAR (currentdate - 1, 'YYYYMMDD'))
AND staffname = c1rec.staffname
AND projectname = c1rec.projectname
AND assignee = c1rec.assignee;
END LOOP;
CLOSE c2;
END;
COMMIT;
--pr_mail_for_no_worklod;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
raise_application_error (-20003, SQLERRM);
/*
--******************************************************************************
作者:王峰
公司:长城数字软件
发布日期:2005-1-6
联系电话:887669825-862
SELECT SUM(NUMBEROFPAGE1), SUM(NUMBEROFPAGE2),
SUM(NUMBEROFPAGE3), SUM(UMBERSOFINTERFACE1), SUM(UMBERSOFINTERFACE2),
SUM(UMBERSOFINTERFACE3)
FROM DW_FACT_WORKLOAD
--*******************************************************************************
*/
END pr_dw_fact_workloadbyday;
/
3、利用job来调度该存储过程将任务平台统计数据生成为xml文件.
CREATE OR REPLACE PROCEDURE .Pr_Xml_Data_File_Gen IS
/******************************************************************************
利用job来调度该存储过程将任务平台统计数据生成为xml文件,以便门户调用
作者:王峰
编写时间:2008-11-21
******************************************************************************/
workload_file_30 VARCHAR2(128) :='D:\SSSS\ABDGF\OA\StatDate\workload_file_30.xml';
personRow v_workload_last30day%ROWTYPE; --获取游标的行变量
TYPE person_cur IS REF CURSOR; --自定义REF游标
cur person_cur;
tempSql VARCHAR2(500) := 'SELECT "员工姓名", "简单页面数", "普通页面数", "复杂页面数", "简单接口数", "普通接口数", "复杂接口数", "任务个数", "逾期任务个数", "计划工时", "实际工时", "折算后编码工作点数", "其它工作点数", "公司最低", "公司最高", ROUND("公司平均") 公司平均, "A类BUG数", "B类BUG数", "C类BUG数", "D类BUG数", "E类BUG数", "应得点数", "扣除点数", "合计点数","排名" FROM v_workload_last30day ';
--初始的查询语句
sqlWhereStr VARCHAR2(500) :=' ';
sqlOrderByStr VARCHAR2(500) :=' order by "排名"';
doc xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象
main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点
root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, '统计数据'); -- 创建根元素
--==================================================
--以下定义元素
person_elmt xmlDom.DOMElement; --定义PERSON元素
summary_elmt xmlDom.DOMElement; --定义summary元素
details_elmt xmlDom.DOMElement; --定义details元素
--==================================================
--以下定义节点
root_node xmlDom.DOMNode; --定义统计数据节点
person_node xmlDom.DOMNode; --定义PERSON节点
summary_node xmlDom.DOMNode; --定义summary节点
details_node xmlDom.DOMNode; --定义details节点
temp_node xmlDom.DOMNode;
--统计数据变量
v_point_min NUMBER :=0; --公司最低点
v_point_max NUMBER :=0; --公司最高点
v_point_avg NUMBER :=0; ----公司平均点数
v_gzlgsjd NUMBER :=0; ----工作量估算精度
BEGIN
-- 向文档节点加入根节点:<统计数据></统计数据>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
--===========================================================================--
summary_elmt := xmldom.createElement(doc, '摘要'); --创建摘要元素
-- 向统计数据节点加入摘要节点<摘要></摘要>
summary_node := xmldom.appendChild(root_node, xmldom.makeNode(summary_elmt));
--===========================================================================--
--向摘要节点加入下列属性
xmlDom.SETATTRIBUTE(summary_elmt,'标题','最近一个月工作量统计排名');
--得到统计摘要数据
SELECT "公司最低", "公司最高", ROUND("公司平均") 公司平均 INTO v_point_min,v_point_max,v_point_avg FROM v_workload_last30day WHERE ROWNUM=1;
--写统计摘要数据到dom
xmlDom.SETATTRIBUTE(summary_elmt,'公司最低',v_point_min);
xmlDom.SETATTRIBUTE(summary_elmt,'公司最高',v_point_max);
xmlDom.SETATTRIBUTE(summary_elmt,'公司平均',v_point_avg);
SELECT ROUND((100*(SUM("实际工时") - SUM("计划工时")))/SUM("计划工时")) 工作量估算精度 INTO v_gzlgsjd FROM v_workload_last30day ;
xmlDom.SETATTRIBUTE(summary_elmt,'工作量估算精度',v_gzlgsjd);
--===========================================================================--
--附加查询条件,准备得到统计明细数据
--===========================================================================--
details_elmt := xmldom.createElement(doc, '统计明细'); --创建摘要元素
-- 向统计数据节点加入统计明细节点<统计明细></统计明细>
details_node := xmldom.appendChild(root_node, xmldom.makeNode(details_elmt));
--===========================================================================--
tempSql := tempSql||sqlWhereStr||sqlOrderByStr;
--打开游标
OPEN cur FOR tempSql;
--遍历游标
LOOP
FETCH cur INTO personRow;
EXIT WHEN cur%NOTFOUND;
--===========================================================================--
person_elmt := xmldom.createElement(doc, '员工'); --创建PERSON元素
-- 向PEOPLE节点加入PERSON节点<PERSON></PERSON>
person_node := xmldom.appendChild(details_node, xmldom.makeNode(person_elmt));
--===========================================================================--
--向PERSON节点加入属性下列属性
xmlDom.SETATTRIBUTE(person_elmt,'员工姓名',personRow.员工姓名);
xmlDom.SETATTRIBUTE(person_elmt,'简单页面数',personRow.简单页面数);
xmlDom.SETATTRIBUTE(person_elmt,'普通页面数',personRow.普通页面数);
xmlDom.SETATTRIBUTE(person_elmt,'复杂页面数',personRow.复杂页面数);
xmlDom.SETATTRIBUTE(person_elmt,'简单接口数',personRow.简单接口数);
xmlDom.SETATTRIBUTE(person_elmt,'普通接口数',personRow.普通接口数);
xmlDom.SETATTRIBUTE(person_elmt,'复杂接口数',personRow.复杂接口数);
xmlDom.SETATTRIBUTE(person_elmt,'任务个数',personRow.任务个数);
xmlDom.SETATTRIBUTE(person_elmt,'逾期任务个数',personRow.逾期任务个数);
xmlDom.SETATTRIBUTE(person_elmt,'计划工时',personRow.计划工时);
xmlDom.SETATTRIBUTE(person_elmt,'实际工时',personRow.实际工时);
xmlDom.SETATTRIBUTE(person_elmt,'折算后编码工作点数',personRow.折算后编码工作点数);
xmlDom.SETATTRIBUTE(person_elmt,'其它工作点数',personRow.其它工作点数);
xmlDom.SETATTRIBUTE(person_elmt,'A类BUG数',personRow.A类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'B类BUG数',personRow.B类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'C类BUG数',personRow.C类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'D类BUG数',personRow.D类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'E类BUG数',personRow.E类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'应得点数',personRow.应得点数);
xmlDom.SETATTRIBUTE(person_elmt,'扣除点数',personRow.扣除点数);
xmlDom.SETATTRIBUTE(person_elmt,'合计点数',personRow.合计点数);
xmlDom.SETATTRIBUTE(person_elmt,'排名',personRow.排名);
--===========================================================================--
-- name_elmt := xmldom.createElement(doc, 'NAME'); --创建NAME元素
-- --向PERSON节点加入子节点NAME
-- name_node := xmldom.appendChild(person_node,xmlDom.makeNode(name_elmt));
-- --向NAME节点加入文本
-- temp_node := xmldom.appendChild(name_node , xmlDom.makeNode(xmldom.createTextNode(doc,personRow.NAME)));
--===========================================================================--
END LOOP;
CLOSE cur;
--写入硬盘
xmlDom.writeToFile(doc,workload_file_30,'UTF-8');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END Pr_Xml_Data_File_Gen;
/
4、利用job来调度该存储过程将任务平台统计数据生成为xml文件.
CREATE OR REPLACE PROCEDURE .Pr_Xml_Staff_Status_Today IS
/******************************************************************************
利用job来调度该存储过程将任务平台统计数据生成为xml文件
作者:王峰
编写时间:2008-11-21
******************************************************************************/
workload_file_30 VARCHAR2(128) :='D:\WEB7895ll\ABCDE\OA\StatDate\staff_status_today.xml';
personRow v_staff_workstatus_today%ROWTYPE; --获取游标的行变量
TYPE person_cur IS REF CURSOR; --自定义REF游标
cur person_cur;
tempSql VARCHAR2(500) := 'SELECT "统计日期", "员工","帐号", "部门","部门编号","待解决任务数", "正在解决任务数", "待解决的任务逾期天数合计", "正在解决的任务逾期天数合计", "待解决的任务点数合计", "待解决的任务工时合计", "正在解决的任务点数合计", "正在解决的任务工时合计", "正在解决的任务已花费工时合计", "正在解决的任务完成百分比", "工作饱和状态" FROM v_staff_workstatus_today';
--初始的查询语句
sqlWhereStr VARCHAR2(500) :=' ';
sqlOrderByStr VARCHAR2(500) :=' order by 部门编号,排序 DESC ,员工';
doc xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象
main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点
root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, '统计数据'); -- 创建根元素
--==================================================
--以下定义元素
dep_elmt xmlDom.DOMElement; --定义部门元素
person_elmt xmlDom.DOMElement; --定义PERSON元素
summary_elmt xmlDom.DOMElement; --定义summary元素
details_elmt xmlDom.DOMElement; --定义details元素
--==================================================
--以下定义节点
root_node xmlDom.DOMNode; --定义统计数据节点
dep_node xmlDom.DOMNode; --定义部门节点
person_node xmlDom.DOMNode; --定义PERSON节点
summary_node xmlDom.DOMNode; --定义summary节点
details_node xmlDom.DOMNode; --定义details节点
temp_node xmlDom.DOMNode;
--统计数据变量
v_point_min NUMBER :=0; --公司最低点
v_point_max NUMBER :=0; --公司最高点
v_point_avg NUMBER :=0; ----公司平均点数
v_temp_dep varchar2(32) :='a'; --临时存放正在写入的人员的部门,主要是为了将同部门的人放到一块
BEGIN
-- 向文档节点加入根节点:<统计数据></统计数据>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
--===========================================================================--
summary_elmt := xmldom.createElement(doc, '摘要'); --创建摘要元素
-- 向统计数据节点加入摘要节点<摘要></摘要>
summary_node := xmldom.appendChild(root_node, xmldom.makeNode(summary_elmt));
--===========================================================================--
--向摘要节点加入下列属性
xmlDom.SETATTRIBUTE(summary_elmt,'标题','今日员工工作饱和状态统计');
--===========================================================================--
--附加查询条件,准备得到统计明细数据
--===========================================================================--
details_elmt := xmldom.createElement(doc, '统计明细'); --创建摘要元素
-- 向统计数据节点加入统计明细节点<统计明细></统计明细>
details_node := xmldom.appendChild(root_node, xmldom.makeNode(details_elmt));
--===========================================================================--
tempSql := tempSql||sqlWhereStr||sqlOrderByStr;
--打开游标
OPEN cur FOR tempSql;
--遍历游标
LOOP
FETCH cur INTO personRow;
EXIT WHEN cur%NOTFOUND;
--写入部门节点
if personRow.部门!=v_temp_dep then
--===========================================================================--
dep_elmt := xmldom.createElement(doc, '部门'); --创建部门元素
-- 向部门元素加入部门节点
dep_node := xmldom.appendChild(details_node, xmldom.makeNode(dep_elmt));
xmlDom.SETATTRIBUTE(dep_elmt,'name',personRow.部门);
--===========================================================================--
v_temp_dep:=personRow.部门;
end if;
--===========================================================================--
person_elmt := xmldom.createElement(doc, '员工'); --创建PERSON元素
-- 向PEOPLE节点加入PERSON节点<PERSON></PERSON>
person_node := xmldom.appendChild(dep_node, xmldom.makeNode(person_elmt));
--===========================================================================--
--向PERSON节点加入属性下列属性
xmlDom.SETATTRIBUTE(person_elmt,'员工姓名',personRow.员工);
xmlDom.SETATTRIBUTE(person_elmt,'帐号',personRow.帐号);
xmlDom.SETATTRIBUTE(person_elmt,'待解决任务数',personRow.待解决任务数);
xmlDom.SETATTRIBUTE(person_elmt,'正在解决任务数',personRow.正在解决任务数);
xmlDom.SETATTRIBUTE(person_elmt,'待解决的任务逾期天数合计',personRow.待解决的任务逾期天数合计);
xmlDom.SETATTRIBUTE(person_elmt,'正在解决的任务逾期天数合计',personRow.正在解决的任务逾期天数合计);
xmlDom.SETATTRIBUTE(person_elmt,'待解决的任务点数合计',personRow.待解决的任务点数合计);
xmlDom.SETATTRIBUTE(person_elmt,'待解决的任务工时合计',personRow.待解决的任务工时合计);
xmlDom.SETATTRIBUTE(person_elmt,'正在解决的任务点数合计',personRow.正在解决的任务点数合计);
xmlDom.SETATTRIBUTE(person_elmt,'正在解决的任务工时合计',personRow.正在解决的任务工时合计);
xmlDom.SETATTRIBUTE(person_elmt,'正在解决的任务已花费工时合计',personRow.正在解决的任务已花费工时合计);
xmlDom.SETATTRIBUTE(person_elmt,'正在解决的任务完成百分比',personRow.正在解决的任务完成百分比);
xmlDom.SETATTRIBUTE(person_elmt,'工作饱和状态',personRow.工作饱和状态);
END LOOP;
CLOSE cur;
--写入硬盘
xmlDom.writeToFile(doc,workload_file_30,'UTF-8');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END Pr_Xml_Staff_Status_Today ;
/
4、利用job来调度该存储过程将任务平台项目数据统计生成为xml文件
CREATE OR REPLACE PROCEDURE .Pr_Xml_Workload_By_Project IS
/******************************************************************************
利用job来调度该存储过程将任务平台项目数据统计生成为xml文件
作者:王峰
编写时间:2008-11-21
******************************************************************************/
workload_file_30 VARCHAR2(128) :='D:\ere\dfgdfg\OA\StatDate\workload_file_30_project.xml';
personRow V_WORKLOAD_BY_PROJECT30%ROWTYPE; --获取游标的行变量
TYPE person_cur IS REF CURSOR; --自定义REF游标
cur person_cur;
tempSql VARCHAR2(500) := 'SELECT "项目名称", "任务点数", "任务个数", "逾期任务个数", a类bug数, b类bug数, c类bug数, d类bug数, e类bug数, "工作量占比", "单点BUG指数" FROM v_workload_by_project30 ';
--初始的查询语句
sqlWhereStr VARCHAR2(500) :=' ';
sqlOrderByStr VARCHAR2(500) :=' order by 任务点数 desc';
v_currentProject VARCHAR2(128); --临时变量,存放当前项目
CURSOR c1_personWorkload_In_project IS
SELECT 员工姓名,任务点数, ROUND(任务点数*100/SUM(任务点数) OVER(PARTITION BY 项目名称 )) 贡献大小
FROM
(
SELECT projectname 项目名称,STAFFNAME 员工姓名,
SUM(POINTNUMBERSOFTASK) 任务点数
FROM .DW_FACT_WORKLOAD
WHERE projectName=v_currentProject AND
DATEID> TO_NUMBER(TO_CHAR(SYSDATE -30,'YYYYMMDD'))
GROUP BY projectname,STAFFNAME
)
ORDER BY 贡献大小 DESC;
doc xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象
main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点
root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, '统计数据'); -- 创建根元素
--==================================================
--以下定义元素
person_elmt xmlDom.DOMElement; --定义PERSON元素
summary_elmt xmlDom.DOMElement; --定义summary元素
details_elmt xmlDom.DOMElement; --定义details元素
details_person_elmt xmlDom.DOMElement; --定义details_person_elmt元素
--==================================================
--以下定义节点
root_node xmlDom.DOMNode; --定义统计数据节点
person_node xmlDom.DOMNode; --定义PERSON节点
summary_node xmlDom.DOMNode; --定义summary节点
details_node xmlDom.DOMNode; --定义details节点
details_person_node xmlDom.DOMNode; --定义员工节点
temp_node xmlDom.DOMNode;
--统计数据变量
v_point_min NUMBER :=0; --公司最低点
v_point_max NUMBER :=0; --公司最高点
v_point_avg NUMBER :=0; ----公司平均点数
BEGIN
-- 向文档节点加入根节点:<统计数据></统计数据>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
--===========================================================================--
summary_elmt := xmldom.createElement(doc, '摘要'); --创建摘要元素
-- 向统计数据节点加入摘要节点<摘要></摘要>
summary_node := xmldom.appendChild(root_node, xmldom.makeNode(summary_elmt));
--===========================================================================--
--向摘要节点加入下列属性
xmlDom.SETATTRIBUTE(summary_elmt,'标题','最近一个月项目工作量统计');
--===========================================================================--
--附加查询条件,准备得到统计明细数据
--===========================================================================--
details_elmt := xmldom.createElement(doc, '统计明细'); --创建摘要元素
-- 向统计数据节点加入统计明细节点<统计明细></统计明细>
details_node := xmldom.appendChild(root_node, xmldom.makeNode(details_elmt));
--===========================================================================--
tempSql := tempSql||sqlWhereStr||sqlOrderByStr;
--打开游标
OPEN cur FOR tempSql;
--遍历游标
LOOP
FETCH cur INTO personRow;
EXIT WHEN cur%NOTFOUND;
--===========================================================================--
person_elmt := xmldom.createElement(doc, '项目'); --创建PERSON元素
-- 向PEOPLE节点加入PERSON节点<PERSON></PERSON>
person_node := xmldom.appendChild(details_node, xmldom.makeNode(person_elmt));
--===========================================================================--
--向PERSON节点加入属性下列属性
xmlDom.SETATTRIBUTE(person_elmt,'项目名称',personRow.项目名称);
xmlDom.SETATTRIBUTE(person_elmt,'任务点数',personRow.任务点数);
xmlDom.SETATTRIBUTE(person_elmt,'任务个数',personRow.任务个数);
xmlDom.SETATTRIBUTE(person_elmt,'逾期任务个数',personRow.逾期任务个数);
xmlDom.SETATTRIBUTE(person_elmt,'A类BUG数',personRow.A类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'B类BUG数',personRow.B类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'C类BUG数',personRow.C类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'D类BUG数',personRow.D类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'E类BUG数',personRow.E类BUG数);
xmlDom.SETATTRIBUTE(person_elmt,'单点BUG指数',personRow.单点BUG指数);
xmlDom.SETATTRIBUTE(person_elmt,'工作量占比',personRow.工作量占比);
v_currentProject :=personRow.项目名称;
FOR c1_temp IN c1_personWorkload_In_project LOOP
--===========================================================================--
details_person_elmt := xmldom.createElement(doc, '员工'); --创建员工元素
-- 向项目节点加入员工节点<员工></员工>
details_person_node := xmldom.appendChild(person_node, xmldom.makeNode(details_person_elmt));
xmlDom.SETATTRIBUTE(details_person_elmt,'员工姓名',c1_temp.员工姓名);
xmlDom.SETATTRIBUTE(details_person_elmt,'任务点数',c1_temp.任务点数);
xmlDom.SETATTRIBUTE(details_person_elmt,'贡献大小',c1_temp.贡献大小);
--===========================================================================--
END LOOP;
END LOOP;
CLOSE cur;
--写入硬盘
xmlDom.writeToFile(doc,workload_file_30,'UTF-8');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END Pr_Xml_Workload_By_Project;
/
5、任务平台利用存储相互过程发邮件
CREATE OR REPLACE PROCEDURE .Pr_Mail_For_No_Worklod
/******************************************************************************
NAME: PR_MAIL_FOR_NO_WORKLOD
PURPOSE: 由JOB每天早晨自动调用该过程给没有填写工作日志的用户发送电子邮件
CREATE OR REPLACE PROCEDURE Send_Mail(sender VARCHAR2,receiver VARCHAR2,subject VARCHAR2,contact VARCHAR2) IS
******************************************************************************/
IS
conn utl_smtp.connection;
username VARCHAR2(256) := 'abff';
PASSWORD VARCHAR2(256) := '22223423423';
yestdayIsHoliday VARCHAR2(4); --是否为节假日;
CURSOR c1 IS SELECT "帐号","姓名" FROM V_WORKLOG_HOURS_STAT WHERE "工作小时" <4 OR "工作小时" >12; --昨天日志没填写或工作时数异常的员工
CURSOR c2 IS SELECT "帐号","姓名","日志天数" FROM V_WORKLOG_COUNT_LAST7 ; --最近一周工作日志填写次数不够5天的员工统计(有可能是请假、忘记填写或出差了)
V_ACCT VARCHAR2(20);
V_NAME VARCHAR2(20);
V_NO_WORKLOG_NAMELIST VARCHAR2(4000):='<LI>'||TO_CHAR(SYSDATE -1,'YYYY-MM-DD')||'日没有填写工作日志或填写时间少于4小时或大于12小时的员工有:'||'<BR/> ';
mesg_body0 VARCHAR2(4000 CHAR) := '<html><head> <title>任务平台日志填写提醒</title></head><BODY bgcolor="#FFFFFF" LINK="#000080"><TABLE cellspacing="0" cellpadding="0" width="100%">';
mesg_body1 VARCHAR2(30000 CHAR) := '<br/><br/>';
mesg_body2 VARCHAR2(200 CHAR):='</font></body></html>';
crlf VARCHAR2(15) := '<br/>';
mesg VARCHAR2(4000 CHAR);
PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
DATA VARCHAR2(4000);
BEGIN
DATA := NAME || ':' || HEADER || utl_tcp.crlf;
utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(DATA));
END;
BEGIN
SELECT isholiday INTO yestdayIsHoliday
FROM DW_DIM_DATE
WHERE dateid = TO_NUMBER(TO_CHAR(SYSDATE -1,'YYYYMMDD')) ;
IF yestdayIsHoliday = '否' THEN
FOR c1_rec IN c1 LOOP
BEGIN
conn := utl_smtp.open_connection('mail.pppddd.cn');
utl_smtp.EHLO(conn, 'mail.pppddd.cn');
--utl_smtp.command(conn, 'AUTH LOGIN');
--utl_smtp.command(conn, username);
--utl_smtp.command(conn, Demo_Base64.encode(utl_raw.cast_to_raw(PASSWORD)));
utl_smtp.mail(conn, username||'@pppddd.cn');
V_ACCT:=c1_rec."帐号"||'@pppddd.cn';
utl_smtp.rcpt(conn,V_ACCT );
utl_smtp.open_data(conn);
send_header('From',username||'@pppddd.cn');
send_header('To',c1_rec."帐号"||'@pppddd.cn');
--send_header('To','wangf@pppddd.cn');
send_header('Subject','任务平台提醒:'||c1_rec."姓名"||',您前一个工作日('||TO_CHAR(SYSDATE -1,'YYYY-MM-DD')||')忘了填写工作日志或填的不正确。');
send_header('Content-type','text/html; charset=gbk');
mesg :=''|| mesg_body0 ||c1_rec."姓名"||': ' || crlf || ' 您好。'||'您昨天('||TO_CHAR(SYSDATE -1,'YYYY-MM-DD')||')忘了填写工作日志或填的不正确(少于4小时或多于12小时)。'||crlf;
mesg :=mesg|| ' 请尽快补填!长城数字软件全体员工感谢您的支持与理解。'||crlf;
mesg :=mesg|| ' <a href=http://mail.pppddd.cn:8880 target=_blank>进入任务平台填写工作日志</a>';
mesg :=mesg|| mesg_body1|| ' 卜海峰 '||TO_CHAR(SYSDATE ,'YYYY-MM-DD')||mesg_body2;
utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(utl_tcp.CRLF||mesg));
utl_smtp.close_data(conn);
utl_smtp.quit(conn);
DBMS_OUTPUT.PUT_LINE(c1_rec."姓名"||'-------发送成功!');
V_NO_WORKLOG_NAMELIST:=V_NO_WORKLOG_NAMELIST ||c1_rec."姓名"||',';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(c1_rec."姓名"||SQLERRM);
-- utl_smtp.close_data(conn);
utl_smtp.rset(conn);
utl_smtp.quit(conn);
END;
END LOOP;
V_NO_WORKLOG_NAMELIST := V_NO_WORKLOG_NAMELIST ||'<BR/><LI>最近一周工作日志填写次数不够5天的员工名单(有可能是请假、忘记填写或出差了):<BR/> ';
FOR c2_rec IN c2 LOOP
BEGIN
V_NO_WORKLOG_NAMELIST:=V_NO_WORKLOG_NAMELIST ||c2_rec."姓名"||'(缺'||TO_CHAR(5 - c2_rec."日志天数")||'天),';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
--给管理人员发送日志填写有问题的人员名单
conn := utl_smtp.open_connection('mail.eu3434.cn');
utl_smtp.EHLO(conn, 'mail.pppddd.cn');
--utl_smtp.command(conn, 'AUTH LOGIN');
--utl_smtp.command(conn, demo_base64.encode(utl_raw.cast_to_raw(username)));
--utl_smtp.command(conn, demo_base64.encode(utl_raw.cast_to_raw(password)));
utl_smtp.mail(conn, username||'@pppddd.cn');
utl_smtp.rcpt(conn, 'm1@pppddd.cn');
utl_smtp.rcpt(conn, 'm2@pppddd.cn');
utl_smtp.rcpt(conn, 'm3@pppddd.cn');
utl_smtp.rcpt(conn, 'm4@pppddd.cn');
utl_smtp.open_data(conn);
send_header('From',username||'@pppddd.cn');
send_header('To','m1@pppddd.cn');
send_header('To','m2@pppddd.cn');
send_header('To','m3@pppddd.cn');
send_header('To','m4@pppddd.cn');
send_header('Subject','任务平台提醒:'||'前一个工作日('||TO_CHAR(SYSDATE -1,'YYYY-MM-DD')||')忘了填写工作日志或填的不正确(少于4小时或多于12小时)的员工名单,请督促其尽快补填。');
send_header('Content-type','text/html; charset=gbk');
V_NO_WORKLOG_NAMELIST := V_NO_WORKLOG_NAMELIST ||'<BR/><BR/> <FONT COLOR=RED>注:如果有不用再提醒的用户,请告诉管理员!</FONT>';
utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(utl_tcp.CRLF||V_NO_WORKLOG_NAMELIST));
utl_smtp.close_data(conn);
utl_smtp.quit(conn);
END IF; --节假日判断
EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
BEGIN
utl_smtp.quit(conn);
-- RAISE_APPLICATION_ERROR(-20000,'Failed to send mail due to the following error: ' || SQLERRM);
EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
utl_smtp.quit(conn);
-- RAISE_APPLICATION_ERROR(-20000,'Failed to send mail due to the following error: ' || SQLERRM);
END;
WHEN OTHERS THEN
utl_smtp.quit(conn);
RAISE_APPLICATION_ERROR(-20000,'Failed to send mail due to the following error: ' || SQLERRM);
END Pr_Mail_For_No_Worklod;
/
6、工作量统计视图
DROP VIEW V_WORKLOAD_ALL;
/* Formatted on 2016/12/23 11:23:06 (QP5 v5.227.12220.39754) */
CREATE OR REPLACE FORCE VIEW V_WORKLOAD_ALL
(
"员工姓名",
"简单页面数",
"普通页面数",
"复杂页面数",
"简单接口数",
"普通接口数",
"复杂接口数",
"任务个数",
"逾期任务个数",
"计划工时",
"实际工时",
"折算后编码工作点数",
"其它工作点数",
"合计点数",
"公司最低",
"公司最高",
"公司平均",
"排名"
)
AS
SELECT 员工姓名,
简单页面数,
普通页面数,
复杂页面数,
简单接口数,
普通接口数,
复杂接口数,
任务个数,
逾期任务个数,
计划工时,
实际工时,
简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12
折算后编码工作点数,
任务点数 其它工作点数,
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12)
合计点数,
MIN (
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12))
OVER ()
公司最低,
MAX (
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12))
OVER ()
公司最高,
AVG (
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12))
OVER ()
公司平均,
DENSE_RANK ()
OVER (
ORDER BY
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12) DESC)
排名
FROM ( SELECT STAFFNAME 员工姓名,
SUM (POINTNUMBERSOFTASK) 任务点数,
SUM (NUMBEROFPAGE1) 简单页面数,
SUM (NUMBEROFPAGE2) 普通页面数,
SUM (NUMBEROFPAGE3) 复杂页面数,
SUM (UMBERSOFINTERFACE1) 简单接口数,
SUM (UMBERSOFINTERFACE2) 普通接口数,
SUM (UMBERSOFINTERFACE3) 复杂接口数,
SUM (NUMBERSOFALLTASK) 任务个数,
SUM (NUMBERSOFOVERDUETASK) 逾期任务个数,
SUM (HOURSFORPLAN) 计划工时,
SUM (HOURSOFFACT) 实际工时
FROM .DW_FACT_WORKLOAD
--WHERE DATEID> TO_NUMBER(TO_CHAR(SYSDATE -365,'YYYYMMDD'))
GROUP BY STAFFNAME);
GRANT SELECT ON .V_WORKLOAD_ALL TO QUERY232;
GRANT SELECT ON .V_WORKLOAD_ALL TO PUBLIC;
7、工作状态视图
DROP VIEW .V_STAFF_WORKSTATUS_TODAY;
/* Formatted on 2016/12/23 11:25:31 (QP5 v5.227.12220.39754) */
CREATE OR REPLACE FORCE VIEW .V_STAFF_WORKSTATUS_TODAY
(
"统计日期",
"员工",
"帐号",
"部门",
"部门编号",
"待解决任务数",
"正在解决任务数",
"待解决的任务逾期天数合计",
"正在解决的任务逾期天数合计",
"待解决的任务点数合计",
"待解决的任务工时合计",
"正在解决的任务点数合计",
"正在解决的任务工时合计",
"正在解决的任务已花费工时合计",
"正在解决的任务完成百分比",
"工作饱和状态",
"排序"
)
AS
SELECT 统计日期,
员工,
帐号,
部门,
部门编号,
待解决任务数,
正在解决任务数,
待解决的任务逾期天数合计,
正在解决的任务逾期天数合计,
待解决的任务点数合计,
待解决的任务工时合计,
正在解决的任务点数合计,
正在解决的任务工时合计,
正在解决的任务已花费工时合计,
正在解决的任务完成百分比,
NVL (b.msgtypename, 工作饱和状态) 工作饱和状态,
排序
FROM (SELECT TO_NUMBER (TO_CHAR (SYSDATE, 'YYYYMMDD')) 统计日期,
员工,
帐号,
部门,
部门编号,
待解决任务数,
正在解决任务数,
待解决的任务逾期天数合计,
正在解决的任务逾期天数合计,
待解决的任务点数合计,
NVL (待解决的任务工时合计, 0)
待解决的任务工时合计,
正在解决的任务点数合计,
NVL (正在解决的任务工时合计, 0)
正在解决的任务工时合计,
正在解决的任务已花费工时合计,
NVL (
(CASE
WHEN 正在解决的任务工时合计 = 0
THEN
0
ELSE
ROUND (
100
* 正在解决的任务已花费工时合计
/ 正在解决的任务工时合计)
END),
0)
正在解决的任务完成百分比,
(CASE
--WHEN 正在解决的任务工时合计<1 AND 最近的工作日志时间<1 THEN '出差'
--WHEN 帐号 = 'caoj'
--THEN '请假'
WHEN 帐号 = 'zhangxm' OR 部门 = '精飞'
THEN
'正常'
WHEN ( 正在解决任务数 = 0
OR 最近的工作日志时间 < 1)
THEN
'闲'
WHEN 正在解决的任务工时合计 < 1
AND 最近的工作日志时间 > 1
AND 最近的工作日志时间 <= 2
THEN
'较闲'
WHEN ( 正在解决的任务工时合计 >= 1
AND 正在解决的任务工时合计 <= 2)
THEN
'正常'
WHEN 正在解决的任务逾期天数合计
/ 正在解决任务数 > 7
AND 最近的工作日志时间 <= 8
THEN
'忙?'
WHEN 正在解决的任务逾期天数合计
/ 正在解决任务数 > 7
AND 最近的工作日志时间 > 8
THEN
'忙'
WHEN 正在解决的任务工时合计 > 8
AND 正在解决的任务工时合计 < 24
THEN
'正常'
ELSE
'正常'
END)
工作饱和状态,
(CASE
--WHEN 正在解决的任务工时合计<1 AND 最近的工作日志时间<1 THEN 'F'
WHEN 最近的工作日志时间 < 1
THEN
'F'
WHEN 正在解决的任务工时合计 < 1
AND 最近的工作日志时间 > 1
THEN
'A'
WHEN ( 正在解决的任务工时合计 > 0
AND 正在解决的任务工时合计 <= 8)
THEN
'B'
WHEN 正在解决的任务逾期天数合计
/ 正在解决任务数 > 7
THEN
'D'
WHEN 正在解决的任务工时合计 > 8
AND 正在解决的任务工时合计 < 24
THEN
'C'
ELSE
'E'
END)
排序
FROM ( SELECT assignee 员工,
empno 帐号,
depname 部门,
depno 部门编号,
SUM (CASE WHEN issuestatus = '1' THEN 1 ELSE 0 END)
待解决任务数,
SUM (CASE WHEN issuestatus = '3' THEN 1 ELSE 0 END)
正在解决任务数,
SUM (
CASE
WHEN issuestatus = '1' AND dueoverdays < 0
THEN
ABS (dueoverdays)
ELSE
0
END)
待解决的任务逾期天数合计,
SUM (
CASE
WHEN issuestatus = '3' AND dueoverdays < 0
THEN
ABS (dueoverdays)
ELSE
0
END)
正在解决的任务逾期天数合计,
SUM (
CASE
WHEN issuestatus = '1' THEN NVL (workload, 0)
ELSE 0
END)
待解决的任务点数合计,
SUM (
CASE
WHEN issuestatus = '1' THEN workhours
ELSE 0
END)
待解决的任务工时合计,
SUM (
CASE
WHEN issuestatus = '3' THEN NVL (workload, 0)
ELSE 0
END)
正在解决的任务点数合计,
SUM (
CASE
WHEN issuestatus = '3' THEN workhours
ELSE 0
END)
正在解决的任务工时合计,
SUM (
CASE
WHEN issuestatus = '3'
THEN
NVL (花费工时, 0)
ELSE
0
END)
正在解决的任务已花费工时合计,
AVG (NVL (tm, 0)) 最近的工作日志时间
FROM (SELECT ID,
pkey,
gdsuser.empno,
gdsuser.depname,
gdsuser.depno,
gdsuser.NAME assignee,
project,
issuetype,
summary,
issuestatus,
created,
duedate,
NVL (ROUND ( (duedate - SYSDATE)), 0)
dueoverdays,
(SELECT numbervalue
FROM customfieldvalue
WHERE customfieldvalue.issue =
issue.ID
AND customfieldvalue.customfield =
10050)
workload,
ROUND (timeoriginalestimate / 3600)
workhours,
(SELECT 花费工时
FROM ( SELECT issueid,
author,
ROUND (
SUM (timeworked) / 3600)
花费工时
FROM worklog
GROUP BY issueid, author)
WHERE issueid = ID
AND author = gdsuser.empno)
花费工时,
(SELECT tm
FROM ( SELECT author,
ROUND (
SUM (timeworked)
/ 3600)
/ COUNT (
DISTINCT ROUND (
startdate,
'DD'))
tm
FROM worklog
WHERE (SYSDATE - updated) < 5
GROUP BY author)
WHERE author = gdsuser.empno)
tm
FROM issue, v_gds_user_from_asasa gdsuser
WHERE issue.assignee = gdsuser.empno
AND issue.project <> 10010
AND ( issue.issuestatus = '1'
OR issue.issuestatus = '3'
OR issue.issuestatus = '4'
OR issue.issuestatus = '8'))
GROUP BY assignee,
depname,
depno,
empno)
WHERE "部门编号" <> '1020'
AND "部门编号" <> '1040'
AND "部门编号" <> '10998'
AND "部门编号" <> '10999'
UNION
SELECT TO_NUMBER (TO_CHAR (SYSDATE, 'YYYYMMDD')) 统计日期,
alluser.NAME,
alluser.empno,
alluser.depname,
alluser.depno,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
'闲',
'A'
FROM v_gds_user_from_asasa alluser
WHERE NOT EXISTS
(SELECT assignee
FROM issue
WHERE project <> 10010
AND ( issue.issuestatus = '1'
OR issue.issuestatus = '3'
OR issue.issuestatus = '4'
OR issue.issuestatus = '8')
AND alluser.empno = assignee) --AND alluser.workertype = '00000001'
--AND (alluser.stationlevel <> '00000001');
) a,
( SELECT employeeno, MAX (msgtypename) msgtypename
FROM v_emp_out_stat
GROUP BY employeeno) b
WHERE (a.帐号 IS NOT NULL)
AND a.帐号 = b.employeeno(+)
AND "部门编号" <> '1020'
AND "部门编号" <> '1040'
AND "部门编号" <> '10998'
AND "部门编号" <> '10999'
/* ########张永平备份于2011-12-20 在改版的基础上增加了根据公司oa显示员工外出状态#########
SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYYMMDD')) 统计日期,员工,帐号,部门, 部门编号,
待解决任务数,
正在解决任务数,
待解决的任务逾期天数合计,
正在解决的任务逾期天数合计,
待解决的任务点数合计,
nvl(待解决的任务工时合计,0) 待解决的任务工时合计,
正在解决的任务点数合计,
nvl(正在解决的任务工时合计,0) 正在解决的任务工时合计,
正在解决的任务已花费工时合计,
nvl((CASE
WHEN 正在解决的任务工时合计=0 THEN 0
ELSE ROUND(100*正在解决的任务已花费工时合计/正在解决的任务工时合计) END),0) 正在解决的任务完成百分比,
(CASE
--WHEN 正在解决的任务工时合计<1 AND 最近的工作日志时间<1 THEN '出差'
WHEN 帐号 ='caoj' THEN '请假'
WHEN 最近的工作日志时间<1 THEN '出差'
WHEN 正在解决的任务工时合计<1 AND 最近的工作日志时间>1 THEN '闲'
WHEN (正在解决的任务工时合计>0 AND 正在解决的任务工时合计<=8) THEN '较闲'
WHEN 正在解决的任务逾期天数合计/正在解决任务数>7 THEN '忙?'
WHEN 正在解决的任务工时合计>8 AND 正在解决的任务工时合计<24 THEN '正常' ELSE '忙' END) 工作饱和状态,
(CASE
--WHEN 正在解决的任务工时合计<1 AND 最近的工作日志时间<1 THEN 'F'
WHEN 最近的工作日志时间<1 THEN 'F'
WHEN 正在解决的任务工时合计<1 AND 最近的工作日志时间>1 THEN 'A'
WHEN (正在解决的任务工时合计>0 AND 正在解决的任务工时合计<=8) THEN 'B'
WHEN 正在解决的任务逾期天数合计/正在解决任务数>7 THEN 'D'
WHEN 正在解决的任务工时合计>8 AND 正在解决的任务工时合计<24 THEN 'C' ELSE 'E' END) 排序
FROM
(
SELECT assignee 员工,EMPNO 帐号,depname 部门,depno 部门编号,
SUM( CASE WHEN ISSUESTATUS='1' THEN 1 ELSE 0 END) 待解决任务数,
SUM( CASE WHEN ISSUESTATUS='3' THEN 1 ELSE 0 END) 正在解决任务数,
SUM( CASE WHEN ISSUESTATUS='1' AND dueOverDays<0 THEN ABS(dueOverDays) ELSE 0 END) 待解决的任务逾期天数合计,
SUM( CASE WHEN ISSUESTATUS='3' AND dueOverDays<0 THEN ABS(dueOverDays) ELSE 0 END) 正在解决的任务逾期天数合计,
SUM( CASE WHEN ISSUESTATUS='1' THEN NVL(workload,0) ELSE 0 END) 待解决的任务点数合计,
SUM( CASE WHEN ISSUESTATUS='1' THEN workHours ELSE 0 END) 待解决的任务工时合计,
SUM( CASE WHEN ISSUESTATUS='3' THEN NVL(workload,0) ELSE 0 END) 正在解决的任务点数合计,
SUM( CASE WHEN ISSUESTATUS='3' THEN workHours ELSE 0 END) 正在解决的任务工时合计,
SUM( CASE WHEN ISSUESTATUS='3' THEN NVL(花费工时,0) ELSE 0 END) 正在解决的任务已花费工时合计,
SUM(NVL(tm,0)) 最近的工作日志时间
FROM
(
SELECT ID, pkey, gdsuser.EMPNO,gdsuser.depname,gdsuser.depno, gdsuser.NAME assignee , PROJECT, ISSUETYPE, SUMMARY, ISSUESTATUS,created, duedate,
NVL(ROUND((duedate - SYSDATE)),0) dueOverDays ,
(SELECT numbervalue FROM CUSTOMFIELDVALUE WHERE CUSTOMFIELDVALUE.issue=ISSUE.ID AND CUSTOMFIELDVALUE.CUSTOMFIELD=10050) workload ,
ROUND(timeoriginalestimate/3600) workHours,
(SELECT 花费工时 FROM (SELECT issueid,author,ROUND(SUM(timeworked)/3600) 花费工时 FROM WORKLOG GROUP BY issueid,author) WHERE issueid=ID AND author=gdsuser.EMPNO) 花费工时,
(SELECT tm FROM (SELECT author, ROUND(SUM(timeworked)/3600) tm FROM WORKLOG WHERE (SYSDATE -updated)<3 GROUP BY author) WHERE author=gdsuser.EMPNO) tm
FROM ISSUE,v_gds_user_from_asasa gdsuser
WHERE ISSUE.assignee = gdsuser.empno(+)
AND ISSUE.PROJECT<>10010 AND (ISSUE.ISSUESTATUS='1' OR ISSUE.ISSUESTATUS='3')
--AND gdsuser.workertype='00000001'
--AND (gdsuser.stationlevel <>'00000001')
)
GROUP BY assignee,depname,depno,EMPNO
)
UNION
SELECT TO_NUMBER (TO_CHAR (SYSDATE, 'YYYYMMDD')) 统计日期, alluser.NAME,
alluser.empno, alluser.depname, alluser.depno, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, '闲', 'A'
FROM v_gds_user_from_asasa alluser
WHERE NOT EXISTS (
SELECT assignee
FROM issue
WHERE project <> 10010
AND (issue.issuestatus = '1'
OR issue.issuestatus = '3'
) AND alluser.empno=assignee)
--AND alluser.workertype = '00000001'
--AND (alluser.stationlevel <> '00000001');
*/
;
GRANT SELECT ON .V_STAFF_WORKSTATUS_TODAY TO QUERY;
8、最近30天工作量统计视图
DROP VIEW .V_WORKLOAD_LAST30DAY;
/* Formatted on 2016/12/23 11:29:11 (QP5 v5.227.12220.39754) */
CREATE OR REPLACE FORCE VIEW .V_WORKLOAD_LAST30DAY
(
"员工姓名",
"简单页面数",
"普通页面数",
"复杂页面数",
"简单接口数",
"普通接口数",
"复杂接口数",
"任务个数",
"逾期任务个数",
"计划工时",
"实际工时",
"折算后编码工作点数",
"其它工作点数",
"公司最低",
"公司最高",
"公司平均",
"A类BUG数",
"B类BUG数",
"C类BUG数",
"D类BUG数",
"E类BUG数",
"应得点数",
"扣除点数",
"合计点数",
"排名"
)
AS
SELECT 员工姓名,
简单页面数,
普通页面数,
复杂页面数,
简单接口数,
普通接口数,
复杂接口数,
任务个数,
逾期任务个数,
计划工时,
实际工时,
简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12
折算后编码工作点数,
任务点数 其它工作点数,
MIN (
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12))
OVER ()
公司最低,
MAX (
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12))
OVER ()
公司最高,
AVG (
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12))
OVER ()
公司平均,
NVL (A类BUG数, 0) A类BUG数,
NVL (B类BUG数, 0) B类BUG数,
NVL (C类BUG数, 0) C类BUG数,
NVL (D类BUG数, 0) D类BUG数,
NVL (E类BUG数, 0) E类BUG数,
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12)
应得点数,
( NVL (A类BUG数, 0) * 10
+ NVL (B类BUG数, 0) * 8
+ NVL (C类BUG数, 0) * 6
+ NVL (D类BUG数, 0) * 4
+ NVL (E类BUG数, 0) * 0)
扣除点数,
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12
- NVL (A类BUG数, 0) * 10
- NVL (B类BUG数, 0) * 8
- NVL (C类BUG数, 0) * 6
- NVL (D类BUG数, 0) * 4
- NVL (E类BUG数, 0) * 0)
合计点数,
DENSE_RANK ()
OVER (
ORDER BY
( 任务点数
+ 简单页面数 * 1
+ 普通页面数 * 5
+ 复杂页面数 * 15
+ 简单接口数 * 1
+ 普通接口数 * 4
+ 复杂接口数 * 12
- NVL (A类BUG数, 0) * 10
- NVL (B类BUG数, 0) * 8
- NVL (C类BUG数, 0) * 6
- NVL (D类BUG数, 0) * 4
- NVL (E类BUG数, 0) * 0) DESC)
排名
FROM ( SELECT STAFFNAME 员工姓名,
SUM (POINTNUMBERSOFTASK) 任务点数,
SUM (NUMBEROFPAGE1) 简单页面数,
SUM (NUMBEROFPAGE2) 普通页面数,
SUM (NUMBEROFPAGE3) 复杂页面数,
SUM (UMBERSOFINTERFACE1) 简单接口数,
SUM (UMBERSOFINTERFACE2) 普通接口数,
SUM (UMBERSOFINTERFACE3) 复杂接口数,
SUM (NUMBERSOFALLTASK) 任务个数,
SUM (NUMBERSOFOVERDUETASK) 逾期任务个数,
SUM (HOURSFORPLAN) 计划工时,
SUM (HOURSOFFACT) 实际工时
FROM .DW_FACT_WORKLOAD, v_gds_user_from_asasa gdsuser
WHERE DW_FACT_WORKLOAD.STAFFNAME = gdsuser.NAME
AND gdsuser.workertype = '00000001'
AND ( gdsuser.stationlevel = '00000003'
OR gdsuser.stationlevel = '00000004')
AND DW_FACT_WORKLOAD.DATEID >
TO_NUMBER (TO_CHAR (SYSDATE - 30, 'YYYYMMDD'))
GROUP BY STAFFNAME) aaa,
( SELECT staffname,
SUM (CASE WHEN bugtype = 'A类' THEN bugnum ELSE 0 END)
A类BUG数,
SUM (CASE WHEN bugtype = 'B类' THEN bugnum ELSE 0 END)
B类BUG数,
SUM (CASE WHEN bugtype = 'C类' THEN bugnum ELSE 0 END)
C类BUG数,
SUM (CASE WHEN bugtype = 'D类' THEN bugnum ELSE 0 END)
D类BUG数,
SUM (CASE WHEN bugtype = 'E类' THEN bugnum ELSE 0 END)
E类BUG数
FROM ( SELECT staffname, bugtype, SUM (bugnum) bugnum
FROM .DW_FACT_BUG, v_gds_user_from_asasa gdsuser
WHERE DW_FACT_BUG.staffname = gdsuser.NAME
AND gdsuser.workertype = '00000001'
AND ( gdsuser.stationlevel = '00000003'
OR gdsuser.stationlevel = '00000004')
AND DW_FACT_BUG.DATEID >
TO_NUMBER (
TO_CHAR (SYSDATE - 30, 'YYYYMMDD'))
GROUP BY STAFFNAME, bugtype)
GROUP BY STAFFNAME) bbb
WHERE aaa.员工姓名 = bbb.STAFFNAME(+);
GRANT SELECT ON .V_WORKLOAD_LAST30DAY TO QUERY;
GRANT SELECT ON .V_WORKLOAD_LAST30DAY TO PUBLIC;
9、java存储过程,用来调用os命令
DROP JAVA SOURCE ."OSCommand";
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED ."OSCommand" as import java.io.*;
public class OSCommand{
public static String Run(String Command){
try{
Runtime.getRuntime().exec(new String(Command.getBytes("GBK"),"ISO-8859-1"));
return("0");
}
catch (Exception e){
System.out.println("Error running command: " + Command +
"\n" + e.getMessage());
return(e.getMessage());
}
}
}
/
CREATE OR REPLACE FUNCTION .OSCommand_Run(Command IN STRING)
RETURN VARCHAR2 IS
LANGUAGE JAVA
NAME 'OSCommand.Run(java.lang.String) return int';
/
10、计算日器的函数
CREATE OR REPLACE FUNCTION .F_Getlunar_Date(i_SolarDay DATE)
RETURN DATE
-- 功能:计算阳历1900/01/31 - 2050/01/22间某一天对应的阴历是多少
-- 算法:在一张表中用10进制格式保存某个农历年每月大小,有无闰月,闰月大小信息
-- 1.用12个2进制位来表示某个农历年每月的大小,大月记为1,否则为0
-- 2.用低4位来表示闰月的月份,没有闰月记为0
-- 3.用一个高位表示闰月的大小,闰月大记为0,闰月小或无闰月记为0
-- 4.再将该2进制数转化为10进制,存入表中
-- 农历2000年: 0 110010010110 0000 -> 0x0c960 -> 51552
-- 农历2001年: 0 110110010101 0100 -> 0x0d954 -> 55636
-- 采用查表的方式计算出农历日期
-- 作者:Angel_XJW
-- 修改:1.
-- 2.
AS
v_OffSet INT;
v_Lunar INT; -- 农历年是否含闰月,几月是闰月,闰月天数,其它月天数
v_YearDays INT; -- 农历年所含天数
v_MonthDays INT; -- 农历月所含天数
v_LeapMonthDays INT; -- 农历闰月所含天数
v_LeapMonth INT; -- 农历年闰哪个月 1-12 , 没闰传回 0
v_LeapFlag INT; -- 某农历月是否为闰月 1:是 0:不是
v_MonthNo INT; -- 某农历月所对应的2进制数 如农历3月: 001000000000
i INT;
j INT;
k INT;
v_Year INT; -- i_SolarDay 对应的农历年
v_Month INT; -- i_SolarDay 对应的农历月
v_Day INT; -- i_SolarDay 对应的农历日
o_OutputDate VARCHAR2(25); -- 返回值 格式:农历 ****年 **(闰)月 **日
e_ErrMsg VARCHAR2(200);
e_ErrDate EXCEPTION;
BEGIN
--输入参数判断
IF i_SolarDay<TO_DATE('1900-01-31','YYYY-MM-DD') OR i_SolarDay>=TO_DATE('2050-01-23','YYYY-MM-DD') THEN
RAISE e_ErrDate;
END IF ;
-- i_SolarDay 到 1900-01-30(即农历1900-01-01的前一天) 的天数
v_OffSet := TRUNC(i_SolarDay, 'DD') - TO_DATE('1900-01-30', 'YYYY-MM-DD');
-- 确定农历年开始
i := 1900;
WHILE i < 2050 AND v_OffSet > 0 LOOP
v_YearDays := 348; -- 29*12 以每年12个农历月,每个农历月含29个农历日为基数
v_LeapMonthDays := 0;
-- 取出农历年是否含闰月,几月是闰月,闰月天数,其它月天数
-- 如农历2001年: 0x0d954(16进制) -> 55636(10进制) -> 0 110110010101 0100(2进制)
-- 1,2,4,5,8,10,12月大, 3,6,7,9,11月小, 4月为闰月,闰月小
SELECT DataInt INTO v_Lunar FROM SOLARDATA WHERE YearId = i;
-- 传回农历年的总天数
j := 32768; -- 100000000000 0000 -> 32768
-- 0 110110010101 0100 -> 55636(农历2001年)
-- 依次判断v_Lunar年个月是否为大月,是则加一天
WHILE j > 8 LOOP -- 闰月另行判断 8 -> 0 000000000000 1000
IF BITAND(v_Lunar, j) + 0 > 0 THEN
v_YearDays := v_YearDays + 1;
END IF;
j := j/2; -- 判断下一个月是否为大
END LOOP;
-- 传回农历年闰哪个月 1-12 , 没闰传回 0 15 -> 1 0000
v_LeapMonth := BITAND(v_Lunar, 15) + 0;
-- 传回农历年闰月的天数 ,加在年的总天数上
IF v_LeapMonth > 0 THEN
-- 判断闰月大小 65536 -> 1 000000000000 0000
IF BITAND(v_Lunar, 65536)+0 > 0 THEN
v_LeapMonthDays := 30;
ELSE
v_LeapMonthDays := 29;
END IF;
v_YearDays := v_YearDays + v_LeapMonthDays;
END IF;
v_OffSet := v_OffSet - v_YearDays;
i := i + 1;
END LOOP;
IF v_OffSet <= 0 THEN
-- i_SolarDay 在所属农历年(即i年)中的第 v_OffSet 天
v_OffSet := v_OffSet + v_YearDays;
i := i - 1;
END IF;
-- 确定农历年结束
v_Year := i;
-- 确定农历月开始
i := 1;
SELECT DataInt INTO v_Lunar FROM SOLARDATA WHERE YearId = v_Year;
-- 判断那个月是润月
-- 如农历2001年 (55636,15 -> 0 1101100101010100, 1111 -> 4) 即润4月,且闰月小
v_LeapMonth := BITAND(v_Lunar, 15) + 0;
v_LeapFlag := 0;
WHILE i < 13 AND v_OffSet > 0 LOOP
-- 判断是否为闰月
v_MonthDays := 0;
IF (v_LeapMonth > 0 AND i = (v_LeapMonth + 1) AND v_LeapFlag = 0) THEN
-- 是闰月
i := i - 1;
k := i; -- 保存是闰月的时i的值
v_LeapFlag := 1;
-- 传回农历年闰月的天数
IF BITAND(v_Lunar, 65536)+0 > 0 THEN
v_MonthDays := 30;
ELSE
v_MonthDays := 29;
END IF;
ELSE
-- 不是闰月
j := 1;
v_MonthNo := 65536;
-- 计算 i 月对应的2进制数 如农历3月: 001000000000
WHILE j<= i LOOP
v_MonthNo := v_MonthNo/2;
j := j + 1;
END LOOP;
-- 计算农历 v_Year 年 i 月的天数
IF BITAND(v_Lunar, v_MonthNo)+0 > 0 THEN
v_MonthDays := 30;
ELSE
v_MonthDays := 29;
END IF;
END IF;
-- 解除闰月
IF v_LeapFlag = 1 AND i = v_LeapMonth +1 THEN
v_LeapFlag := 0;
END IF;
v_OffSet := v_OffSet - v_MonthDays;
i := i + 1;
END LOOP;
IF v_OffSet <= 0 THEN
-- i_SolarDay 在所属农历月(即i月)中的第 v_OffSet 天
v_OffSet := v_OffSet + v_MonthDays;
i := i - 1;
END IF;
-- 确定农历月结束
v_Month := i;
-- 确定农历日结束
v_Day := v_OffSet;
-- 格式化返回值
-- o_OutputDate := '农历 '||TO_CHAR(v_Year)||'年 ';
-- IF k = i THEN
-- o_OutputDate := o_OutputDate || LPAD(TO_CHAR(v_Month), 2, '0')||'(润)月 ';
-- ELSE
-- o_OutputDate := o_OutputDate || LPAD(TO_CHAR(v_Month), 2, '0')||'月 ';
-- END IF;
-- o_OutputDate := o_OutputDate || LPAD(TO_CHAR(v_Day), 2, '0')||'日';
o_OutputDate :=TO_CHAR(v_Year)||'-'|| LPAD(TO_CHAR(v_Month), 2, '0')||'-'|| LPAD(TO_CHAR(v_Day), 2, '0');
BEGIN
RETURN TO_DATE(o_OutputDate,'YYYY-MM-DD');
EXCEPTION
WHEN OTHERS THEN
RETURN TO_DATE(TO_CHAR(v_Year)||'-'|| LPAD(TO_CHAR(v_Month), 2, '0')||'-28','YYYY-MM-DD');
END;
EXCEPTION
WHEN e_Errdate THEN
RETURN '日期错误! 有效范围(阳历): 1900/01/31 - 2050/01/22';
WHEN OTHERS THEN
e_ErrMsg :=SUBSTR(SQLERRM,1,200);
RETURN e_ErrMsg;
END;
/
11、MD5加密函数
CREATE OR REPLACE FUNCTION .Md5( input VARCHAR2 ) RETURN sys.dbms_obfuscation_toolkit.varchar2_checksum AS
BEGIN
RETURN utl_raw.cast_to_raw(dbms_obfuscation_toolkit.Md5(input_string=>utl_raw.cast_to_raw(input)));
END;
12、DBLINK的创建
DROP PUBLIC DATABASE LINK "QUERYFORSHARE.US.ORACLE.COM";
CREATE PUBLIC DATABASE LINK "QUERYFORSHARE.US.ORACLE.COM"
CONNECT TO QUERY
IDENTIFIED BY <PWD>
USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.100.2.2)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = testrep) ) )';
13、创建目录
DROP DIRECTORY WORK_DIR;
CREATE OR REPLACE DIRECTORY
WORK_DIR AS
'C:\ADE\aime_rf\oracle/work';
14、FTP
CREATE OR REPLACE PROCEDURE asasa.Pr_Ftp(aCommandString VARCHAR2) AS LANGUAGE JAVA NAME 'GDSOSCommand.exec(java.lang.String)';
/
---
CREATE OR REPLACE PROCEDURE asasa.Pr_asasa_Stat_Xml_Gen IS
/******************************************************************************
利用job来调度该存储过程将人事系统的统计数据生成为xml文件
作者:王峰
编写时间:2008-11-21
******************************************************************************/
workload_file_30 VARCHAR2(128) :='D:\gds_asasa_xml_data\gds_asasa_stat_data.xml';
currentTJLX VARCHAR2(128);
CURSOR cur_tjlx IS SELECT DISTINCT "统计类型" FROM v_stat_staff_data;
CURSOR cur IS SELECT "统计类型", "指标项", 人数, "占比" FROM v_stat_staff_data WHERE 统计类型=currentTJLX ORDER BY "统计类型", "占比" DESC;
personRow cur%ROWTYPE; --获取游标的行变量
doc xmlDom.DOMDocument := xmldom.newDOMDocument; -- 创建文档对象
main_node xmlDom.DOMNode := xmldom.makeNode(doc); -- 获得文档节点
root_elmt xmlDom.DOMElement:= xmldom.createElement(doc, '西安长城数字软件有限公司人事统计数据'); -- 创建根元素
--==================================================
--以下定义元素
person_elmt xmlDom.DOMElement; --定义PERSON元素
summary_elmt xmlDom.DOMElement; --定义summary元素
details_elmt xmlDom.DOMElement; --定义details元素
--==================================================
--以下定义节点
root_node xmlDom.DOMNode; --定义统计数据节点
person_node xmlDom.DOMNode; --定义PERSON节点
summary_node xmlDom.DOMNode; --定义summary节点
details_node xmlDom.DOMNode; --定义details节点
temp_node xmlDom.DOMNode;
BEGIN
-- 向文档节点加入根节点:<统计数据></统计数据>
root_node := xmldom.appendChild(main_node, xmldom.makeNode(root_elmt));
FOR cur_tjlx_loop IN cur_tjlx LOOP
currentTJLX:=cur_tjlx_loop.统计类型;
--===========================================================================--
--创建统计类型节点
--===========================================================================--
details_elmt := xmldom.createElement(doc,'统计方式' ); --创建统计数据
details_node := xmldom.appendChild(root_node, xmldom.makeNode(details_elmt));
xmlDom.SETATTRIBUTE(details_elmt,'名称',currentTJLX);
--===========================================================================--
--创建各统计类别下的统计指标项
--===========================================================================--
--打开游标
OPEN cur ;
--遍历游标
LOOP
FETCH cur INTO personRow;
EXIT WHEN cur%NOTFOUND;
--===========================================================================--
person_elmt := xmldom.createElement(doc, '分类'); --创建分类元素
person_node := xmldom.appendChild(details_node, xmldom.makeNode(person_elmt));
--===========================================================================--
--向PERSON节点加入属性下列属性
xmlDom.SETATTRIBUTE(person_elmt,'分类名称',personRow.指标项);
xmlDom.SETATTRIBUTE(person_elmt,'人数',personRow.人数);
xmlDom.SETATTRIBUTE(person_elmt,'占比',personRow.占比);
--===========================================================================--
END LOOP;
CLOSE cur;
END LOOP;
--写入硬盘
xmlDom.writeToFile(doc,workload_file_30,'UTF-8');
--发送文件到web服务器中
Pr_Ftp ( 'ftp -s:D:\gds_asasa_xml_data\autoftp.conf' );
EXCEPTION
WHEN OTHERS THEN
-- DBMS_OUTPUT.PUT_LINE(SQLERRM);
RAISE;
END Pr_asasa_Stat_Xml_Gen;
/
15、LDAP
CREATE OR REPLACE PROCEDURE RBAC.PR_SYNC_USERINFO_TO_LDAP
as
ldap_host VARCHAR2(256);
ldap_port PLS_INTEGER;
ldap_user VARCHAR2(256);
ldap_passwd VARCHAR2(256);
ldap_base VARCHAR2(256);
ldap_role_base VARCHAR2(256);
mailDomain VarChar2(256);
retval PLS_INTEGER;
my_session DBMS_LDAP.session;
subscriber_handle DBMS_LDAP_UTL.HANDLE;
-- sub_type PLS_INTEGER;
-- subscriber_id VARCHAR2(2000);
-- my_pset_coll DBMS_LDAP_UTL.PROPERTY_SET_COLLECTION;
-- my_property_names DBMS_LDAP.STRING_COLLECTION;
-- my_property_values DBMS_LDAP.STRING_COLLECTION;
-- user_handle DBMS_LDAP_UTL.HANDLE;
-- user_id VARCHAR2(2000);
-- user_type PLS_INTEGER;
-- user_password VARCHAR2(2000);
-- my_mod_pset DBMS_LDAP_UTL.MOD_PROPERTY_SET;
-- my_attrs DBMS_LDAP.STRING_COLLECTION;
-- user_dn VARCHAR2(256);
CURSOR cur_users IS
--FROM RBAC数据库
SELECT ACCOUNTID, PASSWORD, DISABLED,ISADM, REALNAME, RESERVEMAIL
FROM RBAC_USER where substr(ACCOUNTID,9,2) in ('10','11') ;
--FROM 教务数据库
--SELECT LOGINID ACCOUNTID, PASSWORD, ISACTIVE DISABLED,USERNAME REALNAME, EMALLADDRESS RESERVEMAIL FROM XNJW.USERS WHERE ROWNUM<21;
CURSOR cur_userRoles IS SELECT RBACUSER, ROLENAME FROM V_USER_ALL_ROLE where substr(RBACUSER,9,2) in ('10','11') ;
CURSOR cur_roles IS SELECT ROLENAME,ROLEDESCRIPTION FROM RBAC_ROLE ;
LDAP_DN VarChar2(256);
LDAP_DN_USER_TEMP VarChar2(256);
LDAP_DN_ROLE_TEMP VarChar2(256);
LDAP_Array DBMS_LDAP.MOD_ARRAY;
LDAP_Vals DBMS_LDAP.STRING_COLLECTION;
LDAP_Vals_Int DBMS_LDAP.STRING_COLLECTION;
LDAP_ModArray DBMS_LDAP.MOD_ARRAY;
LDAP_Modval DBMS_LDAP.STRING_COLLECTION;
SOURCE_ChAR_SET VARCHAR2(256);
DEST_ChAR_SET VARCHAR2(256);
BEGIN
-- 请根据LDAP SERVER的环境定制下列属性---------------
ldap_host := '192.168.200.12' ;
ldap_port := '389';
ldap_user := 'cn=Manager,dc=example,dc=com';
ldap_passwd:= 'secret';
ldap_base := 'ou=people,dc=example,dc=com';
ldap_role_base := 'ou=roles,dc=example,dc=com';
mailDomain := 'example.com';
SOURCE_CHAR_SET := 'UTF8';
DEST_CHAR_SET := 'ZHS16CGB231280';
-----------------------------------------------------
DBMS_LDAP.USE_EXCEPTION := TRUE;
DBMS_OUTPUT.PUT('连接到 ' || ldap_host || ' ...');
my_session := DBMS_LDAP.init(ldap_host,ldap_port);
DBMS_OUTPUT.PUT_LINE(': 已连接.');
DBMS_OUTPUT.PUT('绑定到目录as ' || ldap_user || ' ... ');
retval := DBMS_LDAP.simple_bind_s(my_session,
ldap_user,
ldap_passwd);
DBMS_OUTPUT.PUT_LINE('成功');
----------------------------------BEGIN ADD ROLES
FOR CURA in cur_roles LOOP
BEGIN
LDAP_DN :='cn='|| CURA.ROLENAME || ',' || ldap_role_base;
BEGIN
retval := DBMS_LDAP.delete_s(my_session,LDAP_DN);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('要删除的角色: ['|| CONVERT(LDAP_DN,DEST_CHAR_SET,SOURCE_CHAR_SET) || ']本来就不存在.');
END;
LDAP_Array := DBMS_LDAP.create_mod_array(40);
LDAP_Vals.delete;
LDAP_Vals(1) := CONVERT(CURA.ROLENAME,SOURCE_CHAR_SET,DEST_CHAR_SET);
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'cn',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := CONVERT(NVL(CURA.ROLEDESCRIPTION,CURA.ROLENAME||'角色'),SOURCE_CHAR_SET,DEST_CHAR_SET);
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'description',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := 'top';
LDAP_Vals(2) := 'organizationalRole';
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'objectclass',LDAP_Vals);
DBMS_OUTPUT.PUT(RPAD('添加角色: ['|| CONVERT(LDAP_DN,DEST_CHAR_SET,SOURCE_CHAR_SET) || ']',50,' '));
BEGIN
retval := DBMS_LDAP.add_s(my_session,LDAP_DN,LDAP_Array);
EXCEPTION
WHEN OTHERS THEN
-- retval := DBMS_LDAP.delete_s(my_session,LDAP_DN); --若出错,则先删除,再增加
-- retval := DBMS_LDAP.add_s(my_session,LDAP_DN,LDAP_Array);
retval := DBMS_LDAP.modify_s(my_session,LDAP_DN,LDAP_Array);
END;
DBMS_OUTPUT.PUT_LINE(': 成功.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT(RPAD('错误代码 ',10,' ') || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE(' 错误信息 : ' ||SUBSTR(SQLERRM,1,instr(SQLERRM,':',-1))||CONVERT(SUBSTR(SQLERRM, instr(SQLERRM,':',-1) +1),DEST_CHAR_SET,SOURCE_CHAR_SET));
END;
END LOOP;
------------------------------------END ADD ROLES
---------------------------------------
FOR CURA in cur_users LOOP
BEGIN
LDAP_DN :='uid='|| CURA.ACCOUNTID || ',' || ldap_base;
--如果用户状态为锁定('1') 则删除该用户 --
IF CURA.DISABLED ='1' THEN
BEGIN
retval := DBMS_LDAP.delete_s(my_session,LDAP_DN);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('要删除的用户: ['|| CONVERT(LDAP_DN,DEST_CHAR_SET,SOURCE_CHAR_SET) || ']本来就不存在.');
END;
ELSE
-- BEGIN
-- retval := DBMS_LDAP.compare_s(my_session,LDAP_DN,'userPassword',CURA.PASSWORD);
-- EXCEPTION
-- WHEN OTHERS THEN
-- DBMS_OUTPUT.PUT_LINE('比较用户: ['|| CONVERT(LDAP_DN,DEST_CHAR_SET,SOURCE_CHAR_SET) || ']的的密码时出错.');
-- END;
-- --判断用户的密码是否被修改过
-- IF retval IS NOT NULL THEN
-- IF not (retval = dbms_ldap.COMPARE_TRUE) THEN
-- DBMS_OUTPUT.PUT_LINE('用户: ['|| CONVERT(LDAP_DN,DEST_CHAR_SET,SOURCE_CHAR_SET) || ']的密码被修改过!!!');
-- END IF;
-- END IF;
LDAP_Array := DBMS_LDAP.create_mod_array(40);
LDAP_Vals.delete;
LDAP_Vals(1) := 'top';
LDAP_Vals(2) := 'person';
LDAP_Vals(3) := 'organizationalPerson';
LDAP_Vals(4) := 'inetOrgPerson';
LDAP_Vals(5) := 'eduPerson';
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'objectclass',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := CONVERT(NVL(CURA.REALNAME,'用户'||CURA.ACCOUNTID),SOURCE_CHAR_SET,DEST_CHAR_SET);
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'cn',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := CONVERT(NVL(CURA.REALNAME,'用户'||CURA.ACCOUNTID),SOURCE_CHAR_SET,DEST_CHAR_SET);
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'sn',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := CURA.ACCOUNTID;
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'uid',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := CURA.PASSWORD;
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'userpassword',LDAP_Vals);
LDAP_Vals.delete;
LDAP_Vals(1) := NVL(CURA.RESERVEMAIL,CURA.ACCOUNTID ||'@'||mailDomain);
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'mail',LDAP_Vals);
-- LDAP_Vals.delete;
-- LDAP_Vals(1) := '本科生';
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'eduPersonAffiliation',LDAP_Vals);
-- LDAP_Vals.delete;
--
-- LDAP_Vals(1) := '本科生';
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'eduPersonPrimaryAffiliation',LDAP_Vals);
--
-- LDAP_Vals.delete;
-- LDAP_Vals(1) := CURA.ACCOUNTID || '的昵称';
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'eduPersonNickname',LDAP_Vals);
--
-- LDAP_Vals.delete;
-- LDAP_Vals(1) := CURA.ACCOUNTID;
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'eduPersonPrincipalName',LDAP_Vals);
--
-- LDAP_Vals.delete;
-- LDAP_Vals(1) := CURA.ACCOUNTID || '的显示名';
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'displayName',LDAP_Vals);
--
-- LDAP_Vals.delete;
-- LDAP_Vals(1) := CURA.ACCOUNTID || '的givenName';
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'givenName',LDAP_Vals);
--
-- LDAP_Vals.delete;
-- LDAP_Vals(1) := 'zh_CN';
-- DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'preferredLanguage',LDAP_Vals);
--
--
DBMS_OUTPUT.PUT(RPAD('添加用户: ['|| CONVERT(LDAP_DN,DEST_CHAR_SET,SOURCE_CHAR_SET) || ']',50,' '));
BEGIN
retval := DBMS_LDAP.add_s(my_session,LDAP_DN,LDAP_Array);
EXCEPTION
WHEN OTHERS THEN
--retval := DBMS_LDAP.delete_s(my_session,LDAP_DN); --若出错,则先删除,再增加
--retval := DBMS_LDAP.add_s(my_session,LDAP_DN,LDAP_Array);
retval := DBMS_LDAP.modify_s(my_session,LDAP_DN,LDAP_Array); --若出错,则修改
END;
DBMS_OUTPUT.PUT_LINE(': 成功.');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT(RPAD('错误代码 ',10,' ') || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE(' 错误信息 : ' ||SUBSTR(SQLERRM,1,instr(SQLERRM,':',-1))||CONVERT(SUBSTR(SQLERRM, instr(SQLERRM,':',-1) +1),DEST_CHAR_SET,SOURCE_CHAR_SET));
END;
END LOOP;
---绑定用户角色
FOR CURA in cur_userRoles LOOP
BEGIN
LDAP_DN_ROLE_TEMP :='cn='|| CURA.ROLENAME || ',' || ldap_role_base;
LDAP_DN_USER_TEMP :='uid='|| CURA.RBACUSER || ',' || ldap_base;
LDAP_Array := DBMS_LDAP.create_mod_array(14);
LDAP_Vals.delete;
LDAP_Vals(1) := LDAP_DN_USER_TEMP;
DBMS_LDAP.populate_mod_array(LDAP_Array,DBMS_LDAP.MOD_ADD,'roleOccupant',LDAP_Vals);
BEGIN
retval := DBMS_LDAP.modify_s(my_session,LDAP_DN_ROLE_TEMP,LDAP_Array);
EXCEPTION
WHEN OTHERS THEN
--retval := DBMS_LDAP.delete_s(my_session,LDAP_DN); --若出错,则先删除,再增加
--retval := DBMS_LDAP.add_s(my_session,LDAP_DN,LDAP_Array);
null;
END;
DBMS_OUTPUT.PUT_LINE(': 成功.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT(RPAD('错误代码 ',10,' ') || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE(' 错误信息 : ' ||SUBSTR(SQLERRM,1,instr(SQLERRM,':',-1))||CONVERT(SUBSTR(SQLERRM, instr(SQLERRM,':',-1) +1),DEST_CHAR_SET,SOURCE_CHAR_SET));
END;
END LOOP;
--断开与lDAP的绑定----------------
retval := DBMS_LDAP.unbind_s(my_session);
DBMS_OUTPUT.PUT_LINE('操作目录服务成功 .. 正常结束');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(' 错误代码 : ' || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE(' 错误信息 : ' ||SUBSTR(SQLERRM,1,instr(SQLERRM,':',-1))||CONVERT(SUBSTR(SQLERRM, instr(SQLERRM,':',-1) +1),DEST_CHAR_SET,SOURCE_CHAR_SET));
DBMS_OUTPUT.PUT_LINE(' 系统异常退出......');
END PR_SYNC_USERINFO_TO_LDAP;
/
16、send mail
CREATE OR REPLACE PROCEDURE RBAC.send_mail(sender varchar2,receiver varchar2,subject varchar2,contact varchar2) is
conn utl_smtp.connection;
username varchar2(256) := 'webmaster';
password varchar2(256) := 'webmaster';
procedure send_header(name IN varchar2, header in varchar2) as
data varchar2(4000);
begin
data := name || ':' || header || utl_tcp.crlf;
utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(data));
end;
begin
-- BEGIN
-- SELECT PARMVALUE INTO smtpHost FROM SYSTEMCONFIG WHERE PARMNAME='SMTPHOST';
-- EXCEPTION
-- WHEN others THEN smtpHost:='mail.pppddd.cn';
-- END;
-- BEGIN
-- SELECT PARMVALUE INTO username FROM SYSTEMCONFIG WHERE PARMNAME='DEFAULT_SENT_USER_EMAIL';
-- EXCEPTION
-- WHEN others THEN username:='webmaster';
-- END;
-- BEGIN
-- SELECT PARMVALUE INTO password FROM SYSTEMCONFIG WHERE PARMNAME='DEFAULT_SENT_USER_EMAIL';
-- EXCEPTION
-- WHEN others THEN password:='webmaster';
-- END;
conn := utl_smtp.open_connection('mail.pppddd.cn');
utl_smtp.EHLO(conn, 'mail.pppddd.cn');
--utl_smtp.command(conn, 'AUTH LOGIN');
--utl_smtp.command(conn, demo_base64.encode(utl_raw.cast_to_raw(username)));
--utl_smtp.command(conn, demo_base64.encode(utl_raw.cast_to_raw(password)));
utl_smtp.mail(conn, sender);
utl_smtp.rcpt(conn, sender);
utl_smtp.open_data(conn);
send_header('From',sender);
send_header('To',receiver);
send_header('Subject',subject);
send_header('Content-type','text/plain; charset=gbk');
utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(utl_tcp.CRLF||contact));
utl_smtp.close_data(conn);
utl_smtp.quit(conn);
exception
when utl_smtp.transient_error or utl_smtp.permanent_error then
begin
utl_smtp.quit(conn);
exception
when utl_smtp.transient_error or utl_smtp.permanent_error then
null;
end;
when others then
raise_application_error(-20000,
'Failed to send mail due to the following error: ' || sqlerrm);
end;
/