如何使用过程来杀死从java代码调用它的作业?

时间:2015-08-31 13:08:47

标签: java plsql oracle11g dbms-job

我想通过调用下面的过程并传递作业ID,会话ID和会话序列号的参数来从Java应用程序中删除一些作业。它不起作用,我在这里很迷茫。

PROCEDURE kill_batch_test ( 
V_JOB IN VARCHAR2, 
V_SID IN VARCHAR2,
V_SERIAL IN VARCHAR2  ) 
IS                
BEGIN           

      DBMS_JOB.REMOVE(V_JOB);

      execute immediate 'Alter System Kill Session '''|| to_char (V_SID)  || ',' || to_char (V_SERIAL) || ''' IMMEDIATE';  


EXCEPTION

   WHEN OTHERS THEN

RETURN;

END; 

[编辑]

java代码: 这让我得到了用户的工作:

    String sql1 = "select sid SID, username, serial# SERIAL,j.job JOB, WHAT from (select  dj.LOG_USER, dj.JOB, dj.BROKEN, dj.FAILURES, dj.LAST_DATE,dj.LAST_SEC, dj.THIS_DATE, dj.THIS_SEC, dj.NEXT_DATE, dj.NEXT_SEC, dj.INTERVAL, dj.WHAT from dba_jobs dj ) j,(select p.spid, s.username, s.sid, s.serial# from v$process p, v$session s where p.addr  = s.paddr AND s.username = 'EPS') s ";

 SQLQuery res =  (SQLQuery) session.createSQLQuery(sql1).setCacheable(false);
 res.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
 List e = res.list();
 Object o;
 Iterator it = e.iterator();
 for(int i=0;i<e.size();i++){
    o = it.next();
    Map m = (Map)o;
    String sid = null;
    String serial = null;
    String job = null;
    sid = m.get("SID").toString();
    serial = m.get("SERIAL").toString();
    job = m.get("JOB").toString();

这里我称之为程序:

    CallableStatement storedProc = hibConnection.prepareCall(sql);
    storedProc.setString(1,job);
    storedProc.setString(2,sid);
    storedProc.setString(3,serial);
    storedProc.executeUpdate();
}

1 个答案:

答案 0 :(得分:1)

首先,正如评论中所指出的,您的程序的EXCEPTION WHEN OTHERS THEN RETURN部分确实无法帮助您。要阻止它吞下异常,只需将其删除即可。

修复“权限不足”的问题。然后出现错误,以具有适当权限的用户身份连接到您的数据库并运行GRANT ALTER SYSTEM TO <user your Java app connects as>。请注意此权限,因为您的用户现在有权运行许多其他可能的ALTER SYSTEM语句。

最后(您可能已经意识到这一点),请考虑从DBMS_JOB转移到DBMS_SCHEDULER。特别是,后者有一种更强大的方法来停止工作,而不使用您正在使用的有力方法,包括找到用于运行作业的会话并终止该会话。