最近大量的编写存储过程,总结一下。
编写存储过程要符合一定的规则:
create or replace procedure 'name'
is
parms varchar2;//声明 变量
begin
//编写 你的业务逻辑sql
end;
例如,如下的是我编写的一个带游标的
CREATE OR REPLACE PROCEDURE SP_DEMO/******************************************
综合统计--- 储存过程
*******************************************/
IS
FK_TOTAL NUMBER; /*本年度人力外包合同付款总额*/
PK_TOTAL NUMBER; /*项目外包成本 年度付款金额*/
WK_TOTAL NUMBER; /*本年度人力外包工作量*/
CT NUMBER; /*成本*/
EXIST_TOTAL NUMBER; /*是否存在数据*/
CENTER VARCHAR2(256);
COMPANY VARCHAR2(256);
CURSOR CUR_CENTER IS
SELECT ORG.ORGNAME
FROM ORG_ORGANIZATION ORG
WHERE ORG.ORGSEQ LIKE '.1.102516.102251.100068.%' and ORG.ORGSEQ<>'.1.102516.102251.100068.'
ORDER BY ORG.ORGNAME ASC;
CURSOR CUR_COMPANY IS
SELECT V.NAME FROM VENDOR V GROUP BY V.NAME ORDER BY V.NAME ASC;
BEGIN
/*查询表中是否存在存量数据 不存在 则生成历史存量数据 D_BUSINESS 7 代表 成本表 */
SELECT COUNT(*)
INTO EXIST_TOTAL
FROM HF_DIARY_DETAIL D
WHERE TO_CHAR(D.D_TIME, 'YYYY') = TO_CHAR(SYSDATE, 'YYYY')
AND D.D_BUSINESS IN (7, 8);
/*存在历史数据,则删除原始数据,重新插入数据*/
IF EXIST_TOTAL > 0 THEN
DELETE HF_DIARY_DETAIL D
WHERE TO_CHAR(D.D_TIME, 'YYYY') = TO_CHAR(SYSDATE, 'YYYY')
AND D.D_BUSINESS IN (7, 8);
COMMIT;
END IF;
/*开启所属公司游标*/
OPEN CUR_COMPANY;
LOOP
FETCH CUR_COMPANY
INTO COMPANY;
/*结束游标*/
EXIT WHEN CUR_COMPANY %NOTFOUND;
/*开启所属中心游标*/
OPEN CUR_CENTER;
LOOP
FETCH CUR_CENTER
INTO CENTER;
/*结束游标*/
EXIT WHEN CUR_CENTER %NOTFOUND;
/*1.本年度人力外包合同付款总额*/
SELECT SUM(PAY.PYMTTOTAMT) AS TOT
INTO FK_TOTAL
FROM INTER_PM_PAYMENTAPPLY PAY, INTER_PM_CONTRACT CON
WHERE PAY.RLTVCONID = CON.DATAID
AND PAY.RLTVOUTSRGAGRMNTID IS NOT NULL
AND PAY.BLNGCNTR = CENTER
AND CON.SUPPLIER = COMPANY
AND TO_CHAR(PAY.ACTLPYMTDT, 'YYYY') = TO_CHAR(SYSDATE, 'YYYY');
/*1.本年度项目外包合同付款总额*/
SELECT SUM(PAY.PYMTTOTAMT) AS TOT
INTO PK_TOTAL
FROM INTER_PM_PAYMENTAPPLY PAY, INTER_PM_CONTRACT CON
WHERE PAY.RLTVCONID = CON.DATAID
AND CON.DVLPPRJTID IS NOT NULL
AND PAY.BLNGCNTR = CENTER
AND CON.SUPPLIER = COMPANY
AND TO_CHAR(PAY.ACTLPYMTDT, 'YYYY') = TO_CHAR(SYSDATE, 'YYYY');
/*2.本年度人力外包工作量 */
SELECT COUNT(*) AS PTOTL
INTO WK_TOTAL
FROM LABOUR LAB, VENDOR VEN, org_organization org
WHERE LAB.VENDORID = VEN.ID
AND lab.orgcode = org.orgcode
AND LAB.TYPE = 0
and LAB.STAMPOFIN is not null
--1.当年外包人员数量
AND (TO_CHAR(LAB.STAMPOFIN, 'yyyy') = TO_CHAR(SYSDATE, 'YYYY')
--2. 2017 就进组了 到现在也没有出组 或者今年出组
or (LAB.STAMPOFOFF IS NULL OR LAB.STAMPOFOFF>TO_DATE(TO_CHAR(SYSDATE,'yyyy')||'01'||'01','yyyy-mm-dd')))
AND org.orgname = CENTER
AND VEN.NAME = COMPANY;
CT := 0;
IF WK_TOTAL > 0 THEN
CT := FK_TOTAL / WK_TOTAL;
END IF;
/*1.插入外包成本数据 7:外包成本*/
INSERT INTO HF_DIARY_DETAIL D
(D.D_TIME,
D.D_BUSINESS,
D.D_QUOTA,
D.D_SYSTEM,
D.D_PLINE,
D.D_CENTER,
D.D_COMPANY)
VALUES
(SYSDATE, 7, CT, NULL, NULL, CENTER, COMPANY);
/*插入项目外包成本 8:项目外包成本*/
INSERT INTO HF_DIARY_DETAIL D
(D.D_TIME,
D.D_BUSINESS,
D.D_QUOTA,
D.D_SYSTEM,
D.D_PLINE,
D.D_CENTER,
D.D_COMPANY)
VALUES
(SYSDATE, 8, PK_TOTAL, NULL, NULL, CENTER, COMPANY);
END LOOP;
CLOSE CUR_CENTER;
END LOOP;
CLOSE CUR_COMPANY;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
-------------配置job
plsql的命令行中,输入:
variable job1 number;
begin
dbms_job.submit(:job1,'sp_demo;',sysdate,'sysdate+1+60/1440');
end;
/
----------- 启动定时器
begin
dbms_job.run(:job1);
end;
/
-------查看定时器启动、job运行情况
select job,next_date,next_sec,failures,broken from user_jobs;