我在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);
结果,我得到以下内容:
但是,如果我再次执行获取连接ID的查询,则看起来连接ID似乎不见了。我仍然得到返回的36547
值。
我很困惑这个查询取消是否正常工作。我正在执行代码的不同环境中收到一系列不同类型的错误。
当我将其作为SQL查询运行时,我得到上面的错误代码/响应。当我的代码在我的网页中执行时,我收到以下错误:
Cannot cancel queries: Java::ComIbmDb2JccAm::SqlDataException: DB2 SQL Error: SQLCODE=-802, SQLSTATE=22003, SQLERRMC=null, DRIVER=4.16.53
我很好奇我做错了什么?
答案 0 :(得分:2)
我建议在DB2文档中阅读Canceling Activies。取消活动不是关闭连接,而是选择性地中止查询或其他正在运行的任务:
如果活动消耗了太多资源,或者正在运行 很久,你可以取消它。取消活动比强迫更温和 提交活动的申请。取消的活动 将SQL4725N返回给用户,但不结束连接或 影响任何其他用户活动。强制应用程序结束 连接和用户活动。
在您的程序中,您正在寻找应用程序句柄,uow和特定的活动ID。你看过你要取消的活动是/正在做什么的?您可以使用WLM_CAPTURE_ACTIVITY_IN_PROGRESS
首先转储有关该活动的信息,以便您可以调试您的方案。