oracle package比較
11945 ワード
動的SQL TABLE使用判断データ
==========================2011-10-19判断関数
=====================================================
=================================包頭
==================================================
============================================
==========================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;