FOREACH游标内的Informix SQL Execute函数

FOREACH游标内的Informix SQL Execute函数,sql,function,stored-procedures,cursor,informix,Sql,Function,Stored Procedures,Cursor,Informix,Informix版本11.70-12.10 尝试创建一个存储过程来获取锁定表的用户的会话ID,然后使用该会话ID执行一个内置函数 恢复时出现语法错误 有什么帮助吗 CREATE PROCEDURE sp_kill_lock () RETURNING INT as User_Session ; -- declaration of variables DEFINE rsUser_Session INT; -- SELECT each User Session that has a lock

Informix版本11.70-12.10

尝试创建一个存储过程来获取锁定表的用户的会话ID,然后使用该会话ID执行一个内置函数

恢复时出现语法错误

有什么帮助吗

CREATE PROCEDURE sp_kill_lock ()

RETURNING
  INT as User_Session
;

-- declaration of variables
DEFINE rsUser_Session INT;

-- SELECT each User Session that has a lock on a table
SELECT DISTINCT s.sid AS User_Session
FROM sysmaster:syslocks l, sysmaster:syssessions s 
WHERE s.sid = l.owner 
   AND dbsname <> 'sysmaster' 
ORDER BY 1 
INTO TEMP tempSession;

--Cursor
FOREACH 
   SELECT User_Session
   INTO rsUser_Session
   FROM tempSession

RETURN
rsUser_Session;

--kill the session returned
EXECUTE FUNCTION sysadmin:task("onmode","z",rsUser_Session)

WITH RESUME
;

END FOREACH
END PROCEDURE;


 -- Permissions for routine "sp_kill_lock"
 grant execute on function sp_kill_lock to 'public';
WITH RESUME是RETURN语句的一部分,因此在第一个示例中,它应该是:

RETURN rsUser_Session WITH RESUME;
但它在执行时仍然会给您一个错误,因为PROCEDUREcannot返回值。您需要更改它以创建函数

然后它可能不会执行您想要的操作,因为它在执行onmode-z之前返回,因此,例如,如果只有一个会话要终止,它将永远不会执行onmode-z。此外,它还留下了一张临时表

因此,让我们重写它,以始终执行onmode-z,而不使用我正在使用Informix 12.10.FC10DE的临时表:

CREATE FUNCTION sp_kill_lock ()
RETURNING
    INT AS user_session
    , INT AS admin_result
;
-- declaration of variables
DEFINE rsuser_session INT;
DEFINE rsadmin_result INT;

-- SELECT each User Session that has a lock on a table
FOREACH 
    SELECT DISTINCT 
        s.sid AS user_session
    INTO
        rsuser_session
    FROM 
        sysmaster:syslocks AS l
        INNER JOIN 
        sysmaster:syssessions AS s 
        ON
            s.sid = l.owner
    WHERE  
        dbsname <> 'sysmaster' 
    ORDER BY 1 

   LET rsadmin_result = sysadmin:admin('onmode', 'z', rsuser_session);
   -- returning session id and admin execute result which is the value of cmd_number in the table sysadmin:command_history
   RETURN rsuser_session, rsadmin_result WITH RESUME;

END FOREACH
END FUNCTION;

哇,谢谢你,路易斯!当我执行函数sp_kill_lock时,我得到一个错误:SQL错误-79716:系统或内部错误。是不是因为我是锁定表的那个人,所以这个函数终止了我自己的连接?我真的很感谢你的帮助,先生!无论如何,我打开了一个新的ServerStudio窗口,通过该窗口锁定了表,并在原始窗口中执行了该函数,得到了返回的列:user\u session和admin\u result。新窗口出现了错误,因此它正在终止我自己的会话。这是很棒的作品,路易斯。我真的很感激很高兴我能帮忙。为了更正我之前的评论,如果锁位于除sysmaster之外的任何数据库中,您可以终止自己的会话。您可以向函数添加更多逻辑,以避免终止正在执行的会话。
RETURN rsUser_Session WITH RESUME;
CREATE FUNCTION sp_kill_lock ()
RETURNING
    INT AS user_session
    , INT AS admin_result
;
-- declaration of variables
DEFINE rsuser_session INT;
DEFINE rsadmin_result INT;

-- SELECT each User Session that has a lock on a table
FOREACH 
    SELECT DISTINCT 
        s.sid AS user_session
    INTO
        rsuser_session
    FROM 
        sysmaster:syslocks AS l
        INNER JOIN 
        sysmaster:syssessions AS s 
        ON
            s.sid = l.owner
    WHERE  
        dbsname <> 'sysmaster' 
    ORDER BY 1 

   LET rsadmin_result = sysadmin:admin('onmode', 'z', rsuser_session);
   -- returning session id and admin execute result which is the value of cmd_number in the table sysadmin:command_history
   RETURN rsuser_session, rsadmin_result WITH RESUME;

END FOREACH
END FUNCTION;