做了一个JOB,其功能是每10秒检查一次TransLog表,查看其中发送失败的报文,再重新发送到指定服务器!如果没有要发的报文JOB运行正常,查看JOB时可以看到每12秒运行一次,可一旦有了要发送的报文,JOB却不运行了,有时也运行,但没有任何反应,但这时我在SQLPLUS中运行DBMS_JOB.RUN(101);却可以发送出报文,我实在搞不清楚是怎么回事,望大家能帮我看一看!
也就是手工运行过程没问题,手工运行JOB也没问题,但自动运行没反应!
sxychee@163.com
下面是代码,大家应该能看懂!
set serveroutput on;
set timing on;
--JOB要运行的过程
Create Or Replace Procedure CraneReSend as
msg VARCHAR2(100);
dest varchar2(20);
port BINARY_INTEGER;
v_Connection UTL_TCP.CONNECTION;
v_NumWritten PLS_INTEGER;
Error_code number;
Error_msg varchar2(250);
v_TRANSID TransLog.TransID%type;
v_TRANSDATA TransLog.TransData%type;
v_DEST TransLog.DEST%type;
--定义查找要发送的报文
CURSOR c_ReSend is
select TRANSID,TRANSDATA,DEST from TransLog where TransType='1' and Status='13' for update;
BEGIN
--下面这条语句可以每12秒插入一次,是正常的!
Insert into Test Values('Job'||To_Char(SYSDATE,'MM-DD-YY HH:MI:SS AM'));
dest:='172.16.160.34';
port:=5050;
Open c_ReSend;
--以下的发送报文指令好像没有任何反应,
LOOP
FETCH c_ReSend into v_TRANSID,v_TRANSDATA,v_DEST;
EXIT WHEN c_ReSend%notfound;
update TransLog
set Memo='Job Begin' || To_Char(SYSDATE,'MM-DD-YY HH:MI:SS')
where CURRENT of c_ReSend;
msg:=v_dest ||'#'|| v_TRANSDATA;
-- dbms_output.put_line(msg);
v_Connection := UTL_TCP.OPEN_CONNECTION(dest,port);
v_NumWritten := UTL_TCP.WRITE_LINE(v_Connection,msg);
UTL_TCP.CLOSE_CONNECTION(v_Connection);
update TransLog
set Status = '12',Memo='Job Send' || To_Char(SYSDATE,'MM-DD-YY HH:MI:SS AM')
where CURRENT of c_ReSend;
End Loop;
Close c_ReSend;
Commit;
EXCEPTION
WHEN utl_tcp.network_error THEN
update TransLog
set Memo='Job Send Bad' || To_Char(SYSDATE,'YYMMDDHHMISS')
where CURRENT of c_ReSend;
Close c_ReSend;
-- dbms_output.put_line('ReSend to crane error-utl_tcp.network_error!');
WHEN OTHERS THEN
Close c_ReSend;
Error_code := SQLCODE;
Error_msg := SQLERRM;
update TransLog
set Memo='Job Send Bad' || to_char(error_code) ||':'||Error_msg
where CURRENT of c_ReSend;
-- dbms_output.put_line(to_char(error_code) ||':'||Error_msg);
END CraneReSend;
/
show errors;
--execute CraneReSend;--运行过程也没有问题
--添加JOB
DECLARE
v_jobnum BINARY_INTEGER;
Begin
DBMS_JOB.ISUBMIT(101,'CraneReSend;',SYSDATE,'SYSDATE + (10/(24*60*60))');
DBMS_OUTPUT.PUT_LINE('Crane ReSend Job Number assigned to CraneReSend is :' || 101);
commit;
END;
--强行运行JOB,这里运行可达到目的
DECLARE
Begin
DBMS_JOB.RUN(101);
Commit;
END;
--以下查看JOB的语句
col c_what format a10;
col c_interval format a30;
Select JOB,WHAT as c_what,LAST_SEC,INTERVAL as c_interval from user_jobs;
问题二:'abcd'||to_char(1234)这样得到的是abcd1234字符串,但我现在不想得到这个结果,我想这样转换,abcd还是按abcd不变,占两个字的字符串,但1234不想占两个字,只用一个字来表示,其值就是数值型在内存中所占的两个字节一个字为0x04D2 这个值用用字符串来表示是'',再和abcd合在一起,结果为'abcd',这样只占三个字,不知在Oracle中如何用PL/SQL来实现。其实我也不想这样做,但要能信的对方不是PLC,比较特殊,它要对内存的字操作方便一点。我可以用C做个外部函数在Oracle中调用C库来转,但这样太复杂!
既然你的作业每12秒钟确实插入了一条记录,说明是起作用的,但什么叫做“没有反应”,是你的translog表里没有任何记录生成吗?Top
2 楼sxychee(一笑)回复于 2003-01-17 08:36:41 得分 0
没有反应是指我的Socket服务器没有收到报文,但相应的报文肯定是应该发的,因为Run(101)都可以收到报文Top
3 楼sxychee(一笑)回复于 2003-01-17 17:19:44 得分 0
如果没有要发的报文,JOB一切正常,可一旦有了要发的报文,即有了状态为13的记录了,JOB就会停下来,也不会再向数据库中插入值了,我用RUN却可以正常运行,但JOB已停下来了,只有重新ISUBMIT JOB才行Top
4 楼penitent(只取一瓢)回复于 2003-01-17 17:34:06 得分 90
最好是在你job调用的过程中加上异常处理,记录异常到日志文件.
这样才可以定位错误.
job的确有这样的情况,在run状态下不出错,但在自动状态下就有错误.我也遇到过.
在自动状态是有错误的,我需要你的那个自动状态下的异常,最好能通过日志记载下来.
-------------------
另外,试试关闭你的resource_limit=false
即alter system resource_limit=false试试看,是不是你的profile有什么限制Top
5 楼sxychee(一笑)回复于 2003-01-17 23:47:11 得分 0
我也试着将异常写到表中,可表中什么也没能!你说的我再试一试,代码肯定没问题,就是自动运行时有问题!Top
6 楼penitent(只取一瓢)回复于 2003-01-19 09:23:17 得分 0
我也试着将异常写到表中!!
不要被一起回滚了,当然你就看不到了
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12378643/viewspace-619919/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12378643/viewspace-619919/