我的存储过程执行会就会停止
不是终止 感觉就象超时一样 我info_sort_list有3千多万数据 进行拆分
希望大家能帮个忙 感激不尽附存储过程
create or replace procedure site_data_process_row_proc(p_sortList_Row info_sort_list%rowtype)
as
v_insertsqlstr varchar2(256);
v_updatesqlstr varchar2(256);
v_ip_address_id varchar2(64);
v_ip_num int; --ip地址的数组形式
v_is_insert_sql varchar2(256);
v_count_num int;
v_have_table int; --查询表是否存在
v_create_sql varchar2(1024); --发生错误是,用来建表的SQL语句
v_month_str varchar2(10);
begin
DECLARE CURSOR stat_list_cur
IS
SELECT list.ipaddress_id,list.ipnum FROM stat_list list WHERE list.session_id = p_sortList_Row.session_id;
--使用游标来对v_ip_address_id 和 v_ip_num 进行赋值 不可使用直接赋值方式 防止查询不到时产生异常终止程序
--因为info_sort_list表内有些数据不完整 所以处理时需要注意
begin
open stat_list_cur;
FETCH stat_list_cur into v_ip_address_id,v_ip_num; close stat_list_cur;
end;
--得到该条数据的日期
BEGIN
v_month_str := TO_CHAR(to_date(p_sortList_Row.View_Date,'yyyy-mm-dd hh24:mi:ss'),'yyyy_mm'); EXCEPTION
WHEN OTHERS THEN
return;
END;
--原处理方法在查询不到时会产生异常 抛弃
/*
--在stat_list表中查询ip_address_id和ipnum,通过session_id
SELECT list.ipaddress_id,list.ipnum
INTO
v_ip_address_id,v_ip_num
FROM stat_list list
WHERE list.session_id = p_sortList_Row.session_id;*/--对查询后得到的ip地址于ip_num进行判断 如果数据不完整则不对该条数据进行处理 直接返回
if (v_ip_address_id is NULL) then
return;
end if;
if (v_ip_num is NULL) then
return;
end if;--查询一小时之内是否从新登录过
v_is_insert_sql := 'SELECT COUNT(1) FROM stat_site_total_'|| v_month_str||
' WHERE site_type='''|| p_sortList_Row.SITE_TYPE ||
''' AND site_id='|| p_sortList_Row.site_id ||
' AND total_date='''||to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') ||
''' AND ipnum='|| v_ip_num;--执行插入时的语句
v_insertsqlstr := 'insert into STAT_SITE_TOTAL_' || v_month_str ||
' values(''' ||
p_sortList_Row.SITE_TYPE ||''','||
p_sortList_Row.SITE_ID || ','''||
to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') || ''','||
p_sortList_Row.site_count || ','||
'1,'''||
p_sortList_Row.STANDBY1 ||''','''||
v_ip_address_id || ''','||
v_ip_num || ')'
;
--执行更新的语句
v_updatesqlstr := ' UPDATE STAT_SITE_TOTAL_' ||v_month_str ||
' SET ' || ' page_brow_count=page_brow_count+'|| p_sortList_Row.site_count || ','||
' acce_count_total=acce_count_total+1,'||
' standby1='''||p_sortList_Row.STANDBY1|| ''''|| ' WHERE site_type='''|| p_sortList_Row.SITE_TYPE ||
''' AND site_id='|| p_sortList_Row.site_id ||
' AND total_date='''||to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') ||
''' AND ipnum='|| v_ip_num ;
/*v_updatesqlstr := ' UPDATE STAT_SITE_TOTAL_' ||v_month_str ;
v_updatesqlstr := v_updatesqlstr||' SET ' ;v_updatesqlstr := v_updatesqlstr|| ' page_brow_count=page_brow_count+'|| p_sortList_Row.site_count || ',';
v_updatesqlstr := v_updatesqlstr|| ' acce_count_total=acce_count_total+1,';
v_updatesqlstr := v_updatesqlstr|| ' standby1='''||p_sortList_Row.STANDBY1|| '''';v_updatesqlstr := v_updatesqlstr|| ' WHERE site_type='''|| p_sortList_Row.SITE_TYPE ;
v_updatesqlstr := v_updatesqlstr|| ''' AND site_id='|| p_sortList_Row.site_id ;
v_updatesqlstr := v_updatesqlstr|| ' AND total_date='''||to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') ;
v_updatesqlstr := v_updatesqlstr|| ''' AND ipnum='|| v_ip_num ;*/ execute immediate v_is_insert_sql into v_count_num;
-- EXEC_res_SQL_STR(v_is_insert_sql,v_count_num); --用于判断
--1、此表是否存在 如果不存在出现异常后面进行处理
--2、如果返回值为0,则表示该表存在且该用户1小时内为登陆过,执行 exec_sql_str(v_insertsqlstr);将数据直接插入到对应表
--3、如果返回值不为0,则表示该用户1小时内已登陆过,直接更新结果。 if v_count_num = 0 then
execute immediate v_insertsqlstr;
else
execute immediate v_updatesqlstr;
end if;
--==================================================================================================
EXCEPTION
WHEN OTHERS THEN--DBMS_OUTPUT.PUT_LINE('sortListID =: '|| p_sortList_Row.Info_Sort_Id); SELECT COUNT(1) into v_have_table FROM user_tables WHERE table_name = 'STAT_SITE_TOTAL_' || v_month_str;
--查询某表是否已存在,将结果插入v_hava_table变量,如果v_hava_table=0 则表示不存在
v_create_sql := 'create table STAT_SITE_TOTAL_' ||v_month_str || --建表语句
'(
SITE_TYPE VARCHAR2(255),
SITE_ID NUMBER(10),
TOTAL_DATE VARCHAR2(10),
PAGE_BROW_COUNT NUMBER(10),
ACCE_COUNT_TOTAL NUMBER(10),
STANDBY1 VARCHAR2(255),
IPADDRESS_ID VARCHAR2(17),
IPNUM NUMBER(20)
)'; --如果表不存在
if v_have_table = 0 then
execute immediate v_create_sql; --执行建表语句
--!!!执行前应该确认 该用户是否用建表权限 若没有先使用 dba用户 执行 grant create table to user命令
site_data_process_row_proc(p_sortList_Row); --重新执行本存储过称,再对数据进行插入
else
--如果有其他异常 ,对该条数据插入到错误表中 记录,方便事后进行处理
insert into process_error values(p_sortList_Row.info_sort_id,sysdate,1,'');
commit;
end if;
--==================================================================================================end;create or replace procedure site_data_process_proc(bgnID NUMBER,endId Number)
AS
v_row info_sort_list%rowtype;
--声明变量行 v-row 类型为info_sort_list表的?
begin
DECLARE CURSOR site_cursor --声明游标,把info_sort_list表里的所有数据放入到site_cursor游标中去
IS
-- select * FROM info_sort_list list where list.info_sort_id>10965608 and list.info_sort_id<=10970642 order by list.info_sort_id asc;
select * FROM info_sort_list list where list.info_sort_id>=bgnID and list.info_sort_id<=endId order by list.info_sort_id asc;
begin
open site_cursor; --打开游标,对每行进行处理
loop
FETCH site_cursor into v_row; --将每行赋值给变量v_row
EXIT WHEN site_cursor %NOTFOUND; --如果游标已经循环到最后一行结束 退?
BEGIN
site_data_process_row_proc(v_row); --使用site_data_process_row_proc存储过程对每行数据进行处?
insert into process_error values(v_row.info_sort_id,sysdate,9,'Doing');
commit;
EXCEPTION
WHEN OTHERS THEN
insert into process_error values(v_row.info_sort_id,sysdate,0,''); --如果出现一场插入错误表
commit;
close site_cursor;
return;
END;
end loop;
close site_cursor;
end;
end;
不是终止 感觉就象超时一样 我info_sort_list有3千多万数据 进行拆分
希望大家能帮个忙 感激不尽附存储过程
create or replace procedure site_data_process_row_proc(p_sortList_Row info_sort_list%rowtype)
as
v_insertsqlstr varchar2(256);
v_updatesqlstr varchar2(256);
v_ip_address_id varchar2(64);
v_ip_num int; --ip地址的数组形式
v_is_insert_sql varchar2(256);
v_count_num int;
v_have_table int; --查询表是否存在
v_create_sql varchar2(1024); --发生错误是,用来建表的SQL语句
v_month_str varchar2(10);
begin
DECLARE CURSOR stat_list_cur
IS
SELECT list.ipaddress_id,list.ipnum FROM stat_list list WHERE list.session_id = p_sortList_Row.session_id;
--使用游标来对v_ip_address_id 和 v_ip_num 进行赋值 不可使用直接赋值方式 防止查询不到时产生异常终止程序
--因为info_sort_list表内有些数据不完整 所以处理时需要注意
begin
open stat_list_cur;
FETCH stat_list_cur into v_ip_address_id,v_ip_num; close stat_list_cur;
end;
--得到该条数据的日期
BEGIN
v_month_str := TO_CHAR(to_date(p_sortList_Row.View_Date,'yyyy-mm-dd hh24:mi:ss'),'yyyy_mm'); EXCEPTION
WHEN OTHERS THEN
return;
END;
--原处理方法在查询不到时会产生异常 抛弃
/*
--在stat_list表中查询ip_address_id和ipnum,通过session_id
SELECT list.ipaddress_id,list.ipnum
INTO
v_ip_address_id,v_ip_num
FROM stat_list list
WHERE list.session_id = p_sortList_Row.session_id;*/--对查询后得到的ip地址于ip_num进行判断 如果数据不完整则不对该条数据进行处理 直接返回
if (v_ip_address_id is NULL) then
return;
end if;
if (v_ip_num is NULL) then
return;
end if;--查询一小时之内是否从新登录过
v_is_insert_sql := 'SELECT COUNT(1) FROM stat_site_total_'|| v_month_str||
' WHERE site_type='''|| p_sortList_Row.SITE_TYPE ||
''' AND site_id='|| p_sortList_Row.site_id ||
' AND total_date='''||to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') ||
''' AND ipnum='|| v_ip_num;--执行插入时的语句
v_insertsqlstr := 'insert into STAT_SITE_TOTAL_' || v_month_str ||
' values(''' ||
p_sortList_Row.SITE_TYPE ||''','||
p_sortList_Row.SITE_ID || ','''||
to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') || ''','||
p_sortList_Row.site_count || ','||
'1,'''||
p_sortList_Row.STANDBY1 ||''','''||
v_ip_address_id || ''','||
v_ip_num || ')'
;
--执行更新的语句
v_updatesqlstr := ' UPDATE STAT_SITE_TOTAL_' ||v_month_str ||
' SET ' || ' page_brow_count=page_brow_count+'|| p_sortList_Row.site_count || ','||
' acce_count_total=acce_count_total+1,'||
' standby1='''||p_sortList_Row.STANDBY1|| ''''|| ' WHERE site_type='''|| p_sortList_Row.SITE_TYPE ||
''' AND site_id='|| p_sortList_Row.site_id ||
' AND total_date='''||to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') ||
''' AND ipnum='|| v_ip_num ;
/*v_updatesqlstr := ' UPDATE STAT_SITE_TOTAL_' ||v_month_str ;
v_updatesqlstr := v_updatesqlstr||' SET ' ;v_updatesqlstr := v_updatesqlstr|| ' page_brow_count=page_brow_count+'|| p_sortList_Row.site_count || ',';
v_updatesqlstr := v_updatesqlstr|| ' acce_count_total=acce_count_total+1,';
v_updatesqlstr := v_updatesqlstr|| ' standby1='''||p_sortList_Row.STANDBY1|| '''';v_updatesqlstr := v_updatesqlstr|| ' WHERE site_type='''|| p_sortList_Row.SITE_TYPE ;
v_updatesqlstr := v_updatesqlstr|| ''' AND site_id='|| p_sortList_Row.site_id ;
v_updatesqlstr := v_updatesqlstr|| ' AND total_date='''||to_char(to_date(p_sortList_Row.view_DATE,'yyyy-mm-dd hh24:mi:ss'),'yyyymmddhh24') ;
v_updatesqlstr := v_updatesqlstr|| ''' AND ipnum='|| v_ip_num ;*/ execute immediate v_is_insert_sql into v_count_num;
-- EXEC_res_SQL_STR(v_is_insert_sql,v_count_num); --用于判断
--1、此表是否存在 如果不存在出现异常后面进行处理
--2、如果返回值为0,则表示该表存在且该用户1小时内为登陆过,执行 exec_sql_str(v_insertsqlstr);将数据直接插入到对应表
--3、如果返回值不为0,则表示该用户1小时内已登陆过,直接更新结果。 if v_count_num = 0 then
execute immediate v_insertsqlstr;
else
execute immediate v_updatesqlstr;
end if;
--==================================================================================================
EXCEPTION
WHEN OTHERS THEN--DBMS_OUTPUT.PUT_LINE('sortListID =: '|| p_sortList_Row.Info_Sort_Id); SELECT COUNT(1) into v_have_table FROM user_tables WHERE table_name = 'STAT_SITE_TOTAL_' || v_month_str;
--查询某表是否已存在,将结果插入v_hava_table变量,如果v_hava_table=0 则表示不存在
v_create_sql := 'create table STAT_SITE_TOTAL_' ||v_month_str || --建表语句
'(
SITE_TYPE VARCHAR2(255),
SITE_ID NUMBER(10),
TOTAL_DATE VARCHAR2(10),
PAGE_BROW_COUNT NUMBER(10),
ACCE_COUNT_TOTAL NUMBER(10),
STANDBY1 VARCHAR2(255),
IPADDRESS_ID VARCHAR2(17),
IPNUM NUMBER(20)
)'; --如果表不存在
if v_have_table = 0 then
execute immediate v_create_sql; --执行建表语句
--!!!执行前应该确认 该用户是否用建表权限 若没有先使用 dba用户 执行 grant create table to user命令
site_data_process_row_proc(p_sortList_Row); --重新执行本存储过称,再对数据进行插入
else
--如果有其他异常 ,对该条数据插入到错误表中 记录,方便事后进行处理
insert into process_error values(p_sortList_Row.info_sort_id,sysdate,1,'');
commit;
end if;
--==================================================================================================end;create or replace procedure site_data_process_proc(bgnID NUMBER,endId Number)
AS
v_row info_sort_list%rowtype;
--声明变量行 v-row 类型为info_sort_list表的?
begin
DECLARE CURSOR site_cursor --声明游标,把info_sort_list表里的所有数据放入到site_cursor游标中去
IS
-- select * FROM info_sort_list list where list.info_sort_id>10965608 and list.info_sort_id<=10970642 order by list.info_sort_id asc;
select * FROM info_sort_list list where list.info_sort_id>=bgnID and list.info_sort_id<=endId order by list.info_sort_id asc;
begin
open site_cursor; --打开游标,对每行进行处理
loop
FETCH site_cursor into v_row; --将每行赋值给变量v_row
EXIT WHEN site_cursor %NOTFOUND; --如果游标已经循环到最后一行结束 退?
BEGIN
site_data_process_row_proc(v_row); --使用site_data_process_row_proc存储过程对每行数据进行处?
insert into process_error values(v_row.info_sort_id,sysdate,9,'Doing');
commit;
EXCEPTION
WHEN OTHERS THEN
insert into process_error values(v_row.info_sort_id,sysdate,0,''); --如果出现一场插入错误表
commit;
close site_cursor;
return;
END;
end loop;
close site_cursor;
end;
end;
你跳出“循环”的语句是RETURN吧?你测试有执行到这个语句了吗?
就是执行一段时间会卡住
是不是oracle需要设置什么时间??
感觉存储过程没问题 一般执行2小时后会卡死
--得到该条数据的日期
BEGIN
v_month_str := TO_CHAR(to_date(p_sortList_Row.View_Date,
'yyyy-mm-dd hh24:mi:ss'),
'yyyy_mm');
EXCEPTION
WHEN OTHERS THEN
return;
END;
是否应该为: v_month_str := TO_CHAR(to_date(p_sortList_Row.View_Date,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd');两个存贮过程可以分别调试,可用debug一步一步来。
查了吗?卡住的时候,这个session有哪些等待事件?
1.可以通过alter system kill session 'sid,serial#'来杀掉会话。
2.
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL 3.如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待。以下的语句可以查询到谁锁了表,而谁在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
不过每次都是2小时死不会是锁死问题吧 而且时间都一样
这样 我这次查查看
还有oracle有哪里设置超时的地方吗
2 142 32 pipe get handle address 738458108 2C03F9FC buffer length 4096 00001000 timeout 3600 00000E10 2723168908 6 Idle 0 471 WAITING
3 143 125 SQL*Net message from client driver id 1413697536 54435000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 365 WAITING
4 144 9806 SQL*Net message from client driver id 1952673792 74637000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 59907 WAITING
5 145 12682 SQL*Net message from client driver id 1952673792 74637000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 59893 WAITING
6 146 247 SQL*Net message from client driver id 1952673792 74637000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 314 WAITING
7 149 1403 SQL*Net message from client driver id 1413697536 54435000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 309 WAITING
8 150 248 SQL*Net message from client driver id 1413697536 54435000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 0 WAITING
9 151 57 SQL*Net message to client driver id 1413697536 54435000 #bytes 1 00000001 0 00 2000153315 7 Network -1 0 WAITED SHORT TIME
10 152 3145 SQL*Net message from client driver id 1952673792 74637000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 70823 WAITING
11 154 409 rdbms ipc message timeout 500 000001F4 0 00 0 00 2723168908 6 Idle 0 93 WAITING
12 155 3527 SQL*Net message from client driver id 1952673792 74637000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 71033 WAITING
13 159 119 SQL*Net message from client driver id 1413697536 54435000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 471 WAITING
14 160 792 SQL*Net message from client driver id 1413697536 54435000 #bytes 1 00000001 0 00 2723168908 6 Idle 0 309 WAITING
15 161 8 rdbms ipc message timeout 100 00000064 0 00 0 00 2723168908 6 Idle 0 71470 WAITING
16 162 4261 rdbms ipc message timeout 300 0000012C 0 00 0 00 2723168908 6 Idle 0 96 WAITING
17 163 22 rdbms ipc message timeout 180000 0002BF20 0 00 0 00 2723168908 6 Idle 0 57371 WAITING
18 164 6127 smon timer sleep time 300 0000012C failed 0 00 0 00 2723168908 6 Idle 0 89 WAITING
19 165 48279 rdbms ipc message timeout 300 0000012C 0 00 0 00 2723168908 6 Idle 0 2 WAITING
20 166 18581 rdbms ipc message timeout 110 0000006E 0 00 0 00 2723168908 6 Idle 0 0 WAITING
21 167 1846 rdbms ipc message timeout 300 0000012C 0 00 0 00 2723168908 6 Idle 0 54 WAITING
22 168 13 rdbms ipc message timeout 300 0000012C 0 00 0 00 2723168908 6 Idle 0 110 WAITING
23 169 182 rdbms ipc message timeout 300 0000012C 0 00 0 00 2723168908 6 Idle 0 2688 WAITING
24 170 10 pmon timer duration 300 0000012C 0 00 0 00 2723168908 6 Idle 0 71813 WAITINGselect * from v$session_wait
D:\oracle\product\10.2.0\admin\study\bdump\alert_study.log(你的因数据库版本和安装路径会有不同)1)查看v$session_wait,看在等待什么事件。
你列出一大堆的来,但是又没有说明你执行sp的那个session的id
2) 查看有没有锁在等待
select * from dba_waiters;
select * from v$locked_objects;根据你目前的情况来看,我知道的就这些了。
不是什么死 而是不管我执行什么存储过程 只要到2小时就死 哪怕一直insert一个表都是一样的
谁知道哪里调超时时间啊
我的是linux下的oracle 听别人说调connect——time不知道在那里改 知道的麻烦告诉下 谢谢
1.ping 下去;
2.每五分钟左右连接一下Oracle。如果ping先断,那么Oracle没问题,是网络问题。这主要要考虑,防火墙,病毒什么的。
如果ping一直通,那么是Oracle方面的问题。
我执行了 这个存储过程
create or replace procedure TestHours is
begin
FOR a IN 1..999999999
LOOP
dbms_lock.sleep(5);
insert into hptest values(a,sysdate);
commit;
END LOOP;
end TestHours;
执行结果也是2小时就不走了这个给大家看看 肯定是哪里配置问题 麻烦各位朋友帮忙解决下 谢谢
select * from hptest t
order by id desc --2008-11-1 0:10:26select * from hptest t
order by id asc --2008-10-31 22:10:29
首先:查看是否是oracle的问题
其次:死的时间oracle在做什么
最后:找到具体的原因,对症下药!
create or replace procedure TestHours is
begin
FOR a IN 1..999999999
LOOP
dbms_lock.sleep(5);
insert into hptest values(a,sysdate);
commit;
END LOOP;
end TestHours;
执行结果也是2小时就不走了 这个给大家看看 肯定是哪里配置问题 麻烦各位朋友帮忙解决下 谢谢
select * from hptest t
order by id desc 结束时间--2008-11-1 0:10:26 select * from hptest t
order by id asc 开始时间--2008-10-31 22:10:29很明显执行2小时就不动了 我感觉是设置问题 谁知道改哪里设置啊???