关于JOB不能正常运行问题!贴上了代码!(转)

做了一个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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值