oracle package比较

动态SQL TABLE使用
判断数据

===========================================
2011-10-19
判断 函数

create or replace function F_CAN_APPNO_RECALL(app_no in varchar2) return boolean is
  app_count number;
  v_SQLStatement varchar2(512);
  SEND_TIME DATE;
  TYPE cursor_type IS REF CURSOR;
  C_CHKTIME cursor_type;
  i number;--控制查询语句只循环一次
begin
 select count(c_app_no) into app_count from web_app_base a where a.c_app_no=app_no and a.c_app_typ='A' and a.c_prod_no in('0326','0320')
        and a.c_app_status in ('2','O','4') and ROUND(TO_NUMBER(sysdate - a.t_insrnc_bgn_tm)) > -1;
 if(app_count=1)then
          i:=0;
          v_SQLStatement:='select T_SEND_TM from web_trd_app_send_packet where c_app_no ='''|| app_no ||''' order by t_send_tm desc';
          OPEN C_CHKTIME FOR v_SQLStatement;
            loop
               
                FETCH C_CHKTIME INTO  SEND_TIME;
                EXIT WHEN C_CHKTIME%notfound;
                i:=i+1;
                EXIT WHEN i>1;
                IF (FLOOR(SEND_TIME-sysdate) <= -10 ) THEN
                    return true;
                 END IF;
            END LOOP;
          CLOSE C_CHKTIME;
 end if;
  return false;
Exception
  when others then
       return false;
end F_CAN_APPNO_RECALL;

===========================================
不使用游标

create or replace function F_CAN_APPNO_RECALL(app_no in varchar2) return boolean is
  app_count number;
  SEND_TIME DATE;
begin
 select count(c_app_no) into app_count from web_app_base a where a.c_app_no=app_no and a.c_app_typ='A' and a.c_prod_no in('0326','0320')
        and a.c_app_status in ('2','O','4') and ROUND(TO_NUMBER(sysdate - a.t_insrnc_bgn_tm)) > -1;
 if(app_count=1)then
        select max(T_SEND_TM) into SEND_TIME from web_trd_app_send_packet where c_app_no =app_no;
        
        IF (FLOOR(SEND_TIME-sysdate) < -10 ) THEN
           return true;
        END IF;
 end if;
  return false;
Exception
  when others then
       return false;
end F_CAN_APPNO_RECALL;

============================================
包头

create or replace package pkg_finapp_validate_recall is

  -- Author  : CO-ZHANGBAIYU001
  -- Created : 2011-10-19 15:17:03
  -- Purpose : 

  --输入输出参数数组类型
  TYPE Type_Array IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;

  --function F_CAN_APPNO_RECALL(app_no in varchar2, Validate_Type number) return boolean;
  --校验
  procedure P_appno_validate(input_list in Type_Array, Validate_Type in number , output_list out Type_Array);
  
end pkg_finapp_validate_recall;

============================================
包体

create or replace package body pkg_finapp_validate_recall is


  -- 创建 : 2011-10-19 17:01:34
  -- 用途 : 审核校验
  function F_CAN_APPNO_RECALL(app_no in varchar2, Validate_Type number) return boolean is
    app_count number;
    SEND_TIME DATE;
  begin
    IF(Validate_Type = 0) THEN
        select count(c_app_no) into app_count from web_app_base a where a.c_app_no=app_no and a.c_app_status in ('2','O','4') and a.c_app_typ='A'
           and a.c_prod_no in('0326','0320') and ROUND(TO_NUMBER(sysdate - a.t_insrnc_bgn_tm)) > -1;
      ELSE
        select count(c_app_no) into app_count from web_app_base a where a.c_app_no=app_no and a.c_app_status in ('8') and a.c_app_typ='A'
           and a.c_prod_no in('0326','0320') and ROUND(TO_NUMBER(sysdate - a.t_insrnc_bgn_tm)) > -1;
    END IF;

    if(app_count=1) then
          select max(T_SEND_TM) into SEND_TIME from web_trd_app_send_packet where c_app_no =app_no;
         
          IF (FLOOR(SEND_TIME-sysdate) < -10 ) THEN
             RETURN TRUE;
          END IF;
    END IF;
    RETURN FALSE;
    EXCEPTION
      WHEN OTHERS THEN
           RETURN FALSE;
  end F_CAN_APPNO_RECALL;


   -- 创建 : 2011-10-19 17:01:34
  -- 用途 : 校验内容
  procedure P_appno_validate(input_list in Type_Array, Validate_Type in number , output_list out Type_Array) is
    j number:=1;
  begin
    FOR i IN 1..input_list.count LOOP
        IF F_CAN_APPNO_RECALL(input_list(i), Validate_Type) THEN
           output_list(j):=input_list(i);
           j:=j+1;
        END IF;
    END LOOP;
  end P_appno_validate;

end pkg_finapp_validate_recall;

============================================

CREATE OR REPLACE PACKAGE BODY PKG_EPCIS_AUTO_APP_VALIDATE IS

  /*******************************************************
  NAME         :P_EPCIS_AUTO_APP_VALIDATE
  SUMMARY      :
  PARAM        :VARCHAR2 -  App_No           
                NUMBER  -   Validate_Ret     
  DATE         :2011-10-19
  AUTHOR       :CO-ZHANGBAIYU001
  *******************************************************/

  PROCEDURE P_EPCIS_AUTO_APP_VALIDATE(App_No        IN VARCHAR2,
                                      Validate_Type IN NUMBER,
                                      Validate_Ret  OUT NUMBER) IS
    V_ERROR          VARCHAR2(400);
    V_SEND_TIME      NUMBER;
    V_DATA_COUNT     NUMBER;
    V_DAY_TO_INS_BGN NUMBER;
    V_PLY_START_TIME DATE;
    V_PLY_END_TIME   DATE;
    V_PROD_NO        VARCHAR2(50);
  BEGIN
    Validate_Ret := 0;
    IF Validate_Type NOT IN (0, 1) THEN
      RAISE_APPLICATION_ERROR(-20200, '校验类型应为0或1.');
    END IF;
    --判断
    SELECT A.C_PROD_NO
      INTO V_PROD_NO
      FROM WEB_APP_BASE A
     WHERE A.C_APP_NO = App_No;
    --判断数据正确性
    IF V_PROD_NO = '0325' THEN
      SELECT COUNT(A.C_APP_NO)
        INTO V_DATA_COUNT
        FROM WEB_APP_BASE A, WEB_APP_VHL B
       WHERE A.C_APP_NO = B.C_APP_NO
         AND A.C_APP_NO = App_No;
      V_ERROR := '找不到数据.';
    ELSIF V_PROD_NO = '0320' OR V_PROD_NO = '0326' THEN
      SELECT COUNT(A.C_APP_NO)
        INTO V_DATA_COUNT
        FROM WEB_TRD_APP_SEND_PACKET A, WEB_APP_BASE B, WEB_APP_VHL C
       WHERE A.C_QRY_CDE = C.C_QRY_CDE
         AND B.C_APP_NO = C.C_APP_NO
         AND B.C_APP_NO = App_No;
      V_ERROR := '找不到数据.';
    ELSE
      RETURN;
    END IF;
    IF V_DATA_COUNT = 0 THEN
      RAISE_APPLICATION_ERROR(-20201, V_ERROR);
    END IF;

    
    IF V_PROD_NO = '0325' THEN
      IF Validate_Type = 0 THEN
       
        SELECT DAY_TO_BGN
          INTO V_DAY_TO_INS_BGN
          FROM (SELECT TRUNC(SYSDATE) - TRUNC(A.T_INSRNC_BGN_TM) DAY_TO_BGN
                  FROM WEB_APP_BASE A, WEB_APP_VHL B
                 WHERE A.C_APP_NO = B.C_APP_NO
                   AND A.C_APP_NO = App_No
                   AND A.C_PROD_NO IN ('0325')
                   AND A.C_APP_STATUS IN ('2', 'O', '4')
                   AND A.C_APP_TYP = 'A'
                 ORDER BY DAY_TO_BGN DESC)
         WHERE ROWNUM < 2;
      ELSIF Validate_Type = 1 THEN
        
        SELECT DAY_TO_BGN
          INTO V_DAY_TO_INS_BGN
          FROM (SELECT TRUNC(SYSDATE) - TRUNC(A.T_INSRNC_BGN_TM) DAY_TO_BGN
                  FROM WEB_APP_BASE A, WEB_APP_VHL B
                 WHERE A.C_APP_NO = B.C_APP_NO
                   AND A.C_APP_NO = App_No
                   AND A.C_PROD_NO IN ('0325')
                   AND A.C_APP_STATUS IN ('8')
                   AND A.C_APP_TYP = 'A'
                 ORDER BY DAY_TO_BGN DESC)
         WHERE ROWNUM < 2;
      END IF;
    ELSIF V_PROD_NO = '0320' OR V_PROD_NO = '0326' THEN
      IF Validate_Type = 0 THEN
        
        SELECT T_SEND_TM, DAY_TO_BGN
          INTO V_SEND_TIME, V_DAY_TO_INS_BGN
          FROM (SELECT TRUNC(SYSDATE) - TRUNC(C.T_SEND_TM) T_SEND_TM,
                       TRUNC(SYSDATE) - TRUNC(A.T_INSRNC_BGN_TM) DAY_TO_BGN
                  FROM WEB_APP_BASE            A,
                       WEB_APP_VHL             B,
                       WEB_TRD_APP_SEND_PACKET C
                 WHERE A.C_APP_NO = B.C_APP_NO
                   AND B.C_QRY_CDE = C.C_QRY_CDE
                   AND A.C_APP_NO = App_No
                   AND A.C_PROD_NO IN ('0326', '0320')
                      AND A.C_APP_STATUS IN ('2', 'O', '4')
                   AND A.C_APP_TYP = 'A'
                 ORDER BY C.T_SEND_TM DESC)
         WHERE ROWNUM < 2;
      ELSIF Validate_Type = 1 THEN
        
        SELECT T_SEND_TM, DAY_TO_BGN
          INTO V_SEND_TIME, V_DAY_TO_INS_BGN
          FROM (SELECT TRUNC(SYSDATE) - TRUNC(C.T_SEND_TM) T_SEND_TM,
                       TRUNC(SYSDATE) - TRUNC(A.T_INSRNC_BGN_TM) DAY_TO_BGN
                  FROM WEB_APP_BASE            A,
                       WEB_APP_VHL             B,
                       WEB_TRD_APP_SEND_PACKET C
                 WHERE A.C_APP_NO = B.C_APP_NO
                   AND B.C_QRY_CDE = C.C_QRY_CDE
                   AND A.C_APP_NO = App_No
                   AND A.C_PROD_NO IN ('0326', '0320')
                   AND A.C_APP_STATUS IN ('8')
                   AND A.C_APP_TYP = 'A'
                 ORDER BY C.T_SEND_TM DESC)
         WHERE ROWNUM < 2;
      END IF;
      
      IF V_SEND_TIME >= 10 THEN
        
        Validate_Ret := 2;
        RETURN;
      END IF;
    END IF;
    
    IF V_DAY_TO_INS_BGN > 0 THEN
       Validate_Ret := 1;
      RETURN;
    END IF;

    --重复投保校验
    SELECT A.T_INSRNC_BGN_TM, A.T_INSRNC_END_TM
      INTO V_PLY_START_TIME, V_PLY_END_TIME
      FROM WEB_APP_BASE A
     WHERE A.C_APP_NO = App_No ; 
     FOR REC_DIFF_TIME IN (SELECT V_PLY_END_TIME -
                                 A.T_INSRNC_BGN_TM DIFF_TIME1,
                                 V_PLY_START_TIME -
                                 A.T_INSRNC_END_TM DIFF_TIME2
                            FROM WEB_PLY_BASE A, WEB_PLY_VHL B
                           WHERE A.C_APP_NO = B.C_APP_NO
                             AND A.C_PLY_STS = 'I'
                             AND A.C_PROD_NO = V_PROD_NO
                             AND B.C_FRM_NO IN
                                 (SELECT C_FRM_NO
                                    FROM WEB_APP_VHL A
                                   WHERE A.C_APP_NO = App_No)) LOOP
      IF (REC_DIFF_TIME.DIFF_TIME1 > 0 AND REC_DIFF_TIME.DIFF_TIME2 < 0) THEN
        Validate_Ret := 3;
        RETURN;
      END IF;
    END LOOP;

  END P_EPCIS_AUTO_APP_VALIDATE;

END PKG_EPCIS_AUTO_APP_VALIDATE;

猜你喜欢

转载自kzerg.iteye.com/blog/1471438