编写存储过程-配置job-启动定时器及注意事项

最近大量的编写存储过程,总结一下。

编写存储过程要符合一定的规则:

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;


猜你喜欢

转载自blog.csdn.net/zyl_06/article/details/80090176