2016-11-16 75 views
1

我在DB2中有以下存储过程:无法取消查询在DB2

CREATE OR REPLACE PROCEDURE CANCEL_ACTIVITY (IN application_handle INTEGER) 
    LANGUAGE SQL 
BEGIN 
    DECLARE UOW_ID INTEGER; 
    DECLARE ACTIVITY_ID INTEGER; 

    FOR v AS cur1 CURSOR FOR 
    SELECT UOW_ID, ACTIVITY_ID FROM TABLE(SYSPROC.MON_GET_ACTIVITY(application_handle, -1)) 
    DO 
    CALL WLM_CANCEL_ACTIVITY(application_handle, v.uow_id, v.activity_id); 
    END FOR ; 
END 

使用下面的查询,我能找到我的连接ID:

SELECT MON_GET_APPLICATION_HANDLE() from SYSIBM.SYSDUMMY1 

这将返回一个值如36547。所以,我呼吁我只是喜欢这样创建的过程:

CALL CANCEL_ACTIVITY(36547); 

其结果是,我得到如下:

enter image description here

不过,如果我执行一遍获取连接ID的查询,它似乎并不像连接ID已经消失。我仍然得到返回值36547

我很困惑这个查询取消是否可以工作。我正在执行代码的不同环境中出现一系列不同类型的错误。

当我将它作为SQL查询运行时,出现上述错误代码/响应。当我的代码在我的网页中执行时,出现以下错误:

Cannot cancel queries: Java::ComIbmDb2JccAm::SqlDataException: DB2 SQL Error: SQLCODE=-802, SQLSTATE=22003, SQLERRMC=null, DRIVER=4.16.53 

我很好奇我在做什么错?

回答

2

我建议在DB2文档中阅读Canceling Activies。取消的活动没有关闭连接,而是有选择地中止查询或其他正在运行的任务:

If an activity is consuming too many resources, or is running too long, you can cancel it. Canceling an activity is gentler than forcing the application that submitted the activity. A canceled activity returns SQL4725N to the user, but does not end the connection or affect any other user activity. Forcing the application ends both the connection and user activities.

在你的程序中,你正在寻找应用程序手柄,UOW和特定的活动ID。你看过你将要取消的活动吗?您可以使用WLM_CAPTURE_ACTIVITY_IN_PROGRESS首先转储有关该活动的信息,以便您可以调试您的方案。

+0

嗨@data_henrik - 感谢您的解释。这是完整的查询来取消一项活动吗? 'CALL WLM_CANCEL_ACTIVITY(1,2,5)' – theGreenCabbage

+0

是的,应用程序句柄/ UOW标识符/活动ID。 –

+0

等一下,如果你看看我的程序,那是我在做什么,不是吗?我使用'CALL WLM_CANCEL_ACTIVITY(..)' – theGreenCabbage