17,086
社区成员
发帖
与我相关
我的任务
分享
PRO_CREATETABLE_USERMSG PRO_CREATETABLE_USERMSG--start-- 2011-02-22 09:55:40
PRO_CREATETABLE_USERMSG PRO_CREATETABLE_USERMSG_1--create-start-USER_20110222_1_095605095610 2011-02-22 09:56:10
PRO_CREATETABLE_USERMSG PRO_CREATETABLE_USERMSG_1--create-end-USER_20110222_1_095605100340 2011-02-22 10:03:40
PRO_CREATETABLE_USERMSG PRO_CREATETABLE_USERMSG_1--rename--YSER_20110222_1_095605100342 2011-02-22 10:03:42
PRO_CREATETABLE_USERMSG PRO_CREATETABLE_USERMSG--end-- 2011-02-22 10:03:45
CREATE OR REPLACE PROCEDURE PRO_CREATETABLE_USERMSG(FORECASTTYPE IN NUMBER)
AUTHID CURRENT_USER IS
SQL_IN VARCHAR2(5000);
TAB_NAME VARCHAR2(200);
ERR1 VARCHAR2(100);
TOM_SQLCODE VARCHAR2(10);
TOM_IP VARCHAR2(20);
K CHAR(1);
v_starttime varchar2(10);
v_endtime varchar2(10);
v_flag number default 0;
v_exit number default 0;
v_kk number default 0;
v_kk1 number default 0;
v_kk2 number default 0;
BEGIN
SELECT DECODE(SUBSTR(TO_CHAR(SYSDATE, 'HH24'), 1), '0', '1', '2')
INTO K
FROM DUAL; --10点之前 K为1,10点之后(包括10点)K为2
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG--start--',
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss')); --记录程序运行的日志
commit;
IF FORECASTTYPE = 1 THEN --FORECASTTYPE 传入的变量,10之前调用这个存储过程传入的值是1,之后传入的值是2
v_starttime := '070000';
v_endtime := '113000';
while to_char(sysdate, 'hh24miss') between v_starttime and v_endtime loop --循环再7:00到11:30之间循环
v_exit := 0; --退出标志 ,用于测试,第一次生成数据后 就退出循环
update t_message
set send_flag = 2
where send_flag = 1
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--将t_message中send_flag字段先置为2
commit;
select count(*)
into v_flag
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5); --取出t_message中send_flag字段为2的记录条数
--if v_flag >= 1 and mod(to_char(sysdate, 'mi'), 5) = 0 and
--mod(to_char(sysdate, 'ss'), 59) = 0 then
if v_flag >= 1 then --有记录时 就执行下面的建表语句
TAB_NAME := 'USER_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '_1_' ||
TO_CHAR(SYSDATE, 'HH24MISS');--表名
SQL_IN := 'CREATE TABLE ' || TAB_NAME || ' NOLOGGING AS ';
SQL_IN := SQL_IN ||
' SELECT /*+ INDEX(B(USER_MOBILE)) */ USER_MOBILE,FORECAST_AREA,';
SQL_IN := SQL_IN || ' USER_AREA,''' || '07:00''';
SQL_IN := SQL_IN ||
' SEND_TIME,B.SERVICE_ID,MESSAGE,SEV_CODE,FEETYPE AS FEE_TYPE,FEECODE,SEND_FLAG,B.FORECAST_TYPE';
SQL_IN := SQL_IN ||
' FROM T_MESSAGE A, T_USER_MOBILE_DZ B, T_SERVICE C';
SQL_IN := SQL_IN || ' WHERE A.SERVICE_ID = C.ID';
SQL_IN := SQL_IN || ' AND C.SEND_TYPE = 0';
SQL_IN := SQL_IN || ' AND A.SEND_FLAG = 2';
SQL_IN := SQL_IN || ' AND A.AREA_ID = B.FORECAST_AREA';
SQL_IN := SQL_IN || ' AND A.SERVICE_ID = B.SERVICE_ID';
SQL_IN := SQL_IN || ' AND B.USER_STATUS = 1';
SQL_IN := SQL_IN || ' AND DECODE(B.FORECAST_TYPE,9,' || 1 ||
',B.FORECAST_TYPE)=1'; --建表语句
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG_1--create-start-' || TAB_NAME ||
to_char(sysdate, 'hh24miss'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
select count(*)
into v_kk1
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--查看send_flag = 2的记录数
--commit;
DBMS_OUTPUT.put_line('v_kk1:' || v_kk1);--输出记录数
EXECUTE IMMEDIATE SQL_IN;--执行动态建表语句
select count(*)
into v_kk2
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--查看send_flag = 2的记录数
DBMS_OUTPUT.put_line('v_kk2:' || v_kk2);--输出记录数
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG_1--create-end-' || TAB_NAME ||
to_char(sysdate, 'hh24miss'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
commit;
SQL_IN := 'alter table ' || TAB_NAME || ' rename to ' ||
replace(upper(TAB_NAME), 'U', 'Y');--修改前面创建的表的名称
EXECUTE IMMEDIATE SQL_IN;--修改前面创建的表的名称
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG_1--rename--' ||
replace(upper(TAB_NAME), 'U', 'Y') ||
to_char(sysdate, 'hh24miss'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
commit;
v_exit := 1;--退出循环条件
select count(*)
into v_kk
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--查看send_flag = 2的记录数
update t_message
set send_flag = 3
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--将send_flag = 2的记录的 send_flag更新为3
commit;
end if;
exit when v_exit = 1;--退出循环
end loop;
END IF;
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG--end--',
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
commit;
EXCEPTION --异常处理
WHEN OTHERS THEN
ROLLBACK;
ERR1 := SUBSTR(SQLERRM, 1, 100);
TOM_SQLCODE := SQLCODE;
SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') INTO TOM_IP FROM DUAL;
INSERT INTO T_ROVER_ALERT
(ALERTNAME,
ALERTKEY,
ALERTDATE,
DATETIME,
FLAG,
MSG,
ALARTERR,
ALERTLEVEL)
VALUES
(TOM_IP,
'PRO_CREATETABLE_USERMSG',
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),
SYSDATE,
0,
ERR1,
TOM_SQLCODE,
5);
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG--EXCEPTION--' || ERR1,
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));
commit;
END PRO_CREATETABLE_USERMSG;
DBMS_OUTPUT.put_line('v_kk2:' || v_kk2);--输出记录数
---在此处 取得 v_kk1 为0
update t_message
set send_flag = 2
where send_flag = 1
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--将t_message中send_flag字段先置为2
commit;
select count(*)
into v_flag
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5); --取出t_message中send_flag字段为2的记录条数
---在此处 取得 v_flag 为148
--if v_flag >= 1 and mod(to_char(sysdate, 'mi'), 5) = 0 and
--mod(to_char(sysdate, 'ss'), 59) = 0 then
if v_flag >= 1 then --有记录时 就执行下面的建表语句
TAB_NAME := 'USER_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '_1_' ||
TO_CHAR(SYSDATE, 'HH24MISS');--表名
SQL_IN := 'CREATE TABLE ' || TAB_NAME || ' NOLOGGING AS ';
SQL_IN := SQL_IN ||
' SELECT /*+ INDEX(B(USER_MOBILE)) */ USER_MOBILE,FORECAST_AREA,';
SQL_IN := SQL_IN || ' USER_AREA,''' || '07:00''';
SQL_IN := SQL_IN ||
' SEND_TIME,B.SERVICE_ID,MESSAGE,SEV_CODE,FEETYPE AS FEE_TYPE,FEECODE,SEND_FLAG,B.FORECAST_TYPE';
SQL_IN := SQL_IN ||
' FROM T_MESSAGE A, T_USER_MOBILE_DZ B, T_SERVICE C';
SQL_IN := SQL_IN || ' WHERE A.SERVICE_ID = C.ID';
SQL_IN := SQL_IN || ' AND C.SEND_TYPE = 0';
SQL_IN := SQL_IN || ' AND A.SEND_FLAG = 2';
SQL_IN := SQL_IN || ' AND A.AREA_ID = B.FORECAST_AREA';
SQL_IN := SQL_IN || ' AND A.SERVICE_ID = B.SERVICE_ID';
SQL_IN := SQL_IN || ' AND B.USER_STATUS = 1';
SQL_IN := SQL_IN || ' AND DECODE(B.FORECAST_TYPE,9,' || 1 ||
',B.FORECAST_TYPE)=1'; --建表语句
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG_1--create-start-' || TAB_NAME ||
to_char(sysdate, 'hh24miss'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
select count(*)
into v_kk1
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--查看send_flag = 2的记录数
--commit;
DBMS_OUTPUT.put_line('v_kk1:' || v_kk1);--输出记录数
---在此处 取得 v_kk1 为148
EXECUTE IMMEDIATE SQL_IN;--执行动态建表语句
select count(*)
into v_kk2
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--查看send_flag = 2的记录数
DBMS_OUTPUT.put_line('v_kk2:' || v_kk2);--输出记录数
---在此处 取得 v_kk1 为0
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG_1--create-end-' || TAB_NAME ||
to_char(sysdate, 'hh24miss'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
commit;
SQL_IN := 'alter table ' || TAB_NAME || ' rename to ' ||
replace(upper(TAB_NAME), 'U', 'Y');--修改前面创建的表的名称
EXECUTE IMMEDIATE SQL_IN;--修改前面创建的表的名称
insert into t_exec_pro_log
(pro_name, txt, create_time)
values
('PRO_CREATETABLE_USERMSG',
'PRO_CREATETABLE_USERMSG_1--rename--' ||
replace(upper(TAB_NAME), 'U', 'Y') ||
to_char(sysdate, 'hh24miss'),
TO_CHAR(SYSDATE, 'YYYY-MM-DD hh24:mi:ss'));--记录日志
commit;
v_exit := 1;--退出循环条件
select count(*)
into v_kk
from t_message
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--查看send_flag = 2的记录数
update t_message
set send_flag = 3
where send_flag = 2
and forecast_type = FORECASTTYPE
and (service_id = 3 or service_id = 5);--将send_flag = 2的记录的 send_flag更新为3
commit;