Informix SQL 在 FOREACH 游标内执行函数
Informix SQL Execute Function Inside FOREACH Cursor
Informix 版本 11.70 - 12.10
正在尝试创建存储过程以获取已锁定 table 的用户的会话 ID,然后使用该会话 ID 执行内置函数。 Informix我写的程序不多
关于 WITH RESUME 出现语法错误。
有什么帮助吗?
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';
我更改了代码,至少我没有再遇到语法错误了。现在它说函数返回的值太多:
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
--removed this RETURN
--RETURN
--rsUser_Session;
--kill the session returned
EXECUTE FUNCTION sysadmin:admin("onmode","z",rsUser_Session);
--removed the WITH RESUME
END FOREACH
END PROCEDURE;
用于测试锁定 table:
BEGIN WORK;
LOCK TABLE mytable IN EXCLUSIVE MODE
WITH RESUME
是 RETURN
语句的一部分,因此在您的第一个示例中它应该是:
RETURN rsUser_Session WITH RESUME;
但是执行的时候还是会报错,因为PROCEDURE
不能return取值。您需要将其更改为 CREATE FUNCTION
.
那么它可能不会执行您想要的操作,因为它在执行 onmode -z
之前正在 returning,因此,例如,如果只有 1 个会话要终止,它将永远不要执行 onmode -z
。此外,它还留下了温度 table。
所以让我们重写它,始终执行 onmode -z
而不是使用临时 table(我使用的是 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;
Informix 版本 11.70 - 12.10
正在尝试创建存储过程以获取已锁定 table 的用户的会话 ID,然后使用该会话 ID 执行内置函数。 Informix我写的程序不多
关于 WITH RESUME 出现语法错误。
有什么帮助吗?
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';
我更改了代码,至少我没有再遇到语法错误了。现在它说函数返回的值太多:
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
--removed this RETURN
--RETURN
--rsUser_Session;
--kill the session returned
EXECUTE FUNCTION sysadmin:admin("onmode","z",rsUser_Session);
--removed the WITH RESUME
END FOREACH
END PROCEDURE;
用于测试锁定 table:
BEGIN WORK;
LOCK TABLE mytable IN EXCLUSIVE MODE
WITH RESUME
是 RETURN
语句的一部分,因此在您的第一个示例中它应该是:
RETURN rsUser_Session WITH RESUME;
但是执行的时候还是会报错,因为PROCEDURE
不能return取值。您需要将其更改为 CREATE FUNCTION
.
那么它可能不会执行您想要的操作,因为它在执行 onmode -z
之前正在 returning,因此,例如,如果只有 1 个会话要终止,它将永远不要执行 onmode -z
。此外,它还留下了温度 table。
所以让我们重写它,始终执行 onmode -z
而不是使用临时 table(我使用的是 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;