存储过程———>>> 包(两个存储过程一个存储函数)

/*包*/
SCOTT.EMP
DBMS_OUTPUT.PUT_LINE()

CREATE OR REPLACE PACKAGE PKG_BAO IS
  --过程:加工部门信息--
  PROCEDURE SP_DEPT_INFO (
  I_DEPTNO  IN   NUMBER  , --部门编号
  O_RESULT  OUT  NUMBER    --运行结果 0-运行成功 1-运行失败 
  );
  
  --过程:恢复EMP表--
  PROCEDURE SP_EMP_REBUILED;
  
  --函数:判断某年为闰年还是平年--
  FUNCTION F_YEAR (
  I_YEAR    NUMBER  )
  RETURN    VARCHAR2;
  
END PKG_BAO;

CREATE OR REPLACE PACKAGE BODY PKG_BAO IS
  --过程:加工部门信息--
  PROCEDURE SP_DEPT_INFO (
  I_DEPTNO  IN   NUMBER  , --部门编号
  O_RESULT  OUT  NUMBER    --运行结果 0-运行成功 1-运行失败 
  )
  IS
    /*======================================
                   程序说明
    程序名称:SP_DEPT_INFO
    创建人  :zhangjibin
    创建时间:2021-12-23
    功能介绍:统计部门信息
    目标表  :DEPT_INFO
    来源表  :DEPT  --部门信息表
              EMP   --员工信息表
    参数    :I_DEPTNO  部门编号
              O_RESULT  运行结果 0-运行成功 1-运行失败
    修改记录:
    修改时间    修改人   修改内容

    ======================================*/
    V_CT         NUMBER(1)                           ; --数量统计
    V_SP_NAME    VARCHAR2(30)   := 'SP_DEPT_INFO'    ; --程序名称
    V_STEP_CODE  NUMBER(3)      := 0                 ; --步骤编号
    V_STEP_DESC  VARCHAR2(300)                       ; --步骤描述
    V_SQL        CLOB                                ; --SQL代码(记录&运行)
    V_RESULTT    VARCHAR2(300)  := 'SUCCESS'         ; --执行结果
    V_TS         VARCHAR2(30)                        ; --时间戳
    V_SQLL       VARCHAR2(2000)                      ; --SQL代码(运行)
  BEGIN
    --STEP1--
    BEGIN
      V_STEP_CODE := V_STEP_CODE+1;
      V_STEP_DESC := '清除历史数据';

      --核心代码 START--
      V_SQL := 'DELETE FROM DEPT_INFO WHERE DEPTNO = '||I_DEPTNO;
      EXECUTE IMMEDIATE V_SQL;
      COMMIT;
      --核心代码 END--

      V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
      --记录日志--
      INSERT INTO ETL_LOG
      VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
      COMMIT;
    END;

    --STEP2--
    BEGIN
      V_STEP_CODE := V_STEP_CODE+1;
      V_STEP_DESC := '统计指定部门的信息到目标表';

      --核心代码 START--
      V_SQL := '
      INSERT INTO DEPT_INFO
      SELECT D.DEPTNO           ,
             D.DNAME            ,
             COUNT(E.EMPNO)     ,
             SUM(NVL(E.SAL,0))  ,
             AVG(NVL(E.SAL,0))
        FROM DEPT D
        LEFT JOIN EMP E
          ON D.DEPTNO = E.DEPTNO
       WHERE D.DEPTNO = '||I_DEPTNO||'
       GROUP BY D.DEPTNO,D.DNAME';
      EXECUTE IMMEDIATE V_SQL;
      COMMIT;
      --核心代码 END--

      V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
      --记录日志--
      INSERT INTO ETL_LOG
      VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
      COMMIT;
    END;

    O_RESULT := 0;
    
    --异常处理--
    EXCEPTION
      WHEN OTHERS THEN
        V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
        V_RESULTT := 'FAILED'||SQLERRM;
        O_RESULT := 1;
        --记录日志--
        INSERT INTO ETL_LOG VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
        COMMIT;
  END SP_DEPT_INFO;
  
  --过程:恢复EMP表--
  PROCEDURE SP_EMP_REBUILED
  IS
    /*======================================
                   程序说明
    程序名称:SP_EMP_REBUILED
    创建人  :zhangjibin
    创建时间:2021-12-22
    功能介绍:用于恢复EMP表
    修改记录:
    修改时间    修改人   修改内容
    2021-12-23  peiqi    补充了日志
    ...
    ======================================*/
    V_CT         NUMBER(1)                           ; --数量统计
    V_SP_NAME    VARCHAR2(30)   := 'SP_EMP_REBUILED' ; --程序名称
    V_STEP_CODE  NUMBER(3)      := 0                 ; --步骤编号
    V_STEP_DESC  VARCHAR2(300)                       ; --步骤描述
    V_SQL        CLOB                                ; --SQL代码(记录&运行)
    V_RESULTT    VARCHAR2(300)  := 'SUCCESS'         ; --执行结果
    V_TS         VARCHAR2(30)                        ; --时间戳
    V_SQLL       VARCHAR2(2000)                      ; --SQL代码(运行)
  BEGIN
    --STEP1--
    BEGIN
      V_STEP_CODE := V_STEP_CODE+1;
      V_STEP_DESC := '删除EMP表';

      --核心代码 START--
      SELECT COUNT(*) INTO V_CT FROM USER_TABLES WHERE TABLE_NAME = 'EMP';
      IF V_CT = 1 THEN
        V_SQL := 'DROP TABLE EMP';
        EXECUTE IMMEDIATE V_SQL;
      END IF;
      --核心代码 END--

      V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
      --记录日志--
      INSERT INTO ETL_LOG
      VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
      COMMIT;
    END;

    --STEP2--
    BEGIN
      V_STEP_CODE := V_STEP_CODE+1;
      V_STEP_DESC := '创建EMP表';

      --核心代码 START--
      V_SQL :='
      CREATE TABLE EMP     (
      EMPNO    NUMBER(4)   ,
      ENAME    VARCHAR2(10),
      JOB      VARCHAR2(9) ,
      MGR      NUMBER(4)   , --modified by zjb at 20211223 精度调为4
      HIREDATE DATE        ,
      SAL      NUMBER(7,2) ,
      COMM     NUMBER(7,2) ,
      DEPTNO   NUMBER(2)   ) ';
      EXECUTE IMMEDIATE V_SQL;
      --核心代码 END--

      V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
      --记录日志--
      INSERT INTO ETL_LOG
      VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
      COMMIT;
    END;

    --STEP3--
    BEGIN
      V_STEP_CODE := V_STEP_CODE+1;
      V_STEP_DESC := '插入数据';

      --核心代码 START--
      V_SQLL := 'INSERT INTO EMP
      VALUES (7369, ''SMITH'', ''CLERK'', 7902, TO_DATE(''17-12-1980'', ''dd-mm-yyyy''), 800.00, NULL, 20)';
      V_SQL  := V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7499, ''ALLEN'', ''SALESMAN'', 7698, TO_DATE(''20-02-1981'', ''dd-mm-yyyy''), 1600.00, 300.00, 30)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7521, ''WARD'', ''SALESMAN'', 7698, TO_DATE(''22-02-1981'', ''dd-mm-yyyy''), 1250.00, 500.00, 30)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7566, ''JONES'', ''MANAGER'', 7839, TO_DATE(''02-04-1981'', ''dd-mm-yyyy''), 2975.00, NULL, 20)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7654, ''MARTIN'', ''SALESMAN'', 7698, TO_DATE(''28-09-1981'', ''dd-mm-yyyy''), 1250.00, 1400.00, 30)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7698, ''BLAKE'', ''MANAGER'', 7839, TO_DATE(''01-05-1981'', ''dd-mm-yyyy''), 2850.00, NULL, 30)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7782, ''CLARK'', ''MANAGER'', 7839, TO_DATE(''09-06-1981'', ''dd-mm-yyyy''), 2450.00, NULL, 10)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7788, ''SCOTT'', ''ANALYST'', 7566, TO_DATE(''19-04-1987'', ''dd-mm-yyyy''), 3000.00, NULL, 20)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7839, ''KING'', ''PRESIDENT'', NULL, TO_DATE(''17-11-1981'', ''dd-mm-yyyy''), 5000.00, NULL, 10)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7844, ''TURNER'', ''SALESMAN'', 7698, TO_DATE(''08-09-1981'', ''dd-mm-yyyy''), 1500.00, 0.00, 30)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7876, ''ADAMS'', ''CLERK'', 7788, TO_DATE(''23-05-1987'', ''dd-mm-yyyy''), 1100.00, NULL, 20)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7900, ''JAMES'', ''CLERK'', 7698, TO_DATE(''03-12-1981'', ''dd-mm-yyyy''), 950.00, NULL, 30)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7902, ''FORD'', ''ANALYST'', 7566, TO_DATE(''03-12-1981'', ''dd-mm-yyyy''), 3000.00, NULL, 20)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'INSERT INTO EMP
      VALUES (7934, ''MILLER'', ''CLERK'', 7782, TO_DATE(''23-01-1982'', ''dd-mm-yyyy''), 1300.00, NULL, 10)';
      V_SQL  := V_SQL||';'||CHR(13)||V_SQLL||';';
      EXECUTE IMMEDIATE V_SQLL;

      COMMIT;
      --核心代码 END--

      V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
      --记录日志--
      INSERT INTO ETL_LOG
      VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
      COMMIT;
    END;

    --STEP4--
    BEGIN
      V_STEP_CODE := V_STEP_CODE+1;
      V_STEP_DESC := '创建约束';

      --核心代码 START--
      V_SQLL := 'ALTER TABLE EMP ADD CONSTRAINT PK_EMP PRIMARY KEY (EMPNO)';
      V_SQL := V_SQLL;
      EXECUTE IMMEDIATE V_SQLL;

      V_SQLL := 'ALTER TABLE EMP ADD CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO)
      REFERENCES DEPT(DEPTNO)';
      V_SQL := V_SQL||';'||CHR(13)||V_SQLL||';';
      EXECUTE IMMEDIATE V_SQLL;
      --核心代码 END--

      V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
      --记录日志--
      INSERT INTO ETL_LOG
      VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
      COMMIT;
    END;

    --异常处理--
    EXCEPTION
      WHEN OTHERS THEN
        V_TS := TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS.FF3');
        V_RESULTT := 'FAILED'||SQLERRM;
        --记录日志--
        INSERT INTO ETL_LOG VALUES(V_SP_NAME,V_STEP_CODE,V_STEP_DESC,V_SQL,V_RESULTT,V_TS);
        COMMIT;
        RAISE;
  END SP_EMP_REBUILED;  
  
  --函数:判断某年为闰年还是平年--
  FUNCTION F_YEAR (
  I_YEAR    NUMBER  )
  RETURN    VARCHAR2
  IS
  BEGIN
    IF MOD(I_YEAR,4) = 0 AND MOD(I_YEAR,100) <> 0 OR MOD(I_YEAR,400) = 0 THEN
      RETURN '闰年';
    ELSE
      RETURN '平年';
    END IF;
  END F_YEAR;
  
END PKG_BAO;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值