不要用分号结束
我正在尝试编写一个将结束会话的脚本。在尝试立即执行时,SQL命令没有正确结束,我无法弄清楚我做错了什么以及为什么会收到错误消息。我已删除;形成cur_show_connection行,但这并不能很好地工作。
|| ''' IMMEDIATE' sqlstatement
这是我的完整代码
declare
cursor cur_show_connections is
SELECT 'ALTER SYSTEM DISCONNECT SESSION '''
|| SID
|| ','
|| SERIAL#
|| ''' IMMEDIATE;' sqlstatement
FROM v$session
WHERE machine = 'XXXXX';
sqlstr varchar2(3200) :='';
begin
for rec_show_connections in cur_show_connections loop
sqlstr := sqlstr || rec_show_connections.sqlstatement || chr(13) || chr(10);
--Tried here and this didnt work either
--EXECUTE IMMEDIATE sqlstr;
end loop;
dbms_output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;
--This seems to work hardcoding the values
--EXECUTE IMMEDIATE q'[ALTER SYSTEM DISCONNECT SESSION '425,7516' IMMEDIATE]';
end;
如有任何帮助,我们将不胜感激。
ALTER SYSTEM
命令。EXECUTE IMMEDIATE
命令将处理此问题。
cursor cur_show_connections is
SELECT 'ALTER SYSTEM DISCONNECT SESSION '''
|| SID
|| ','
|| SERIAL#
|| ''' IMMEDIATE' sqlstatement
FROM v$session
WHERE machine = 'XXXXX';
您还将命令连接到一个EXECUTE IMMEDIATE语句中。这样做不会奏效:EXECUTE IMMEDIATE一次只能运行一个命令或PL/SQL块。
for rec_show_connections in cur_show_connections loop
dbms_output.put_line(rec_show_connections.sqlstatement);
EXECUTE IMMEDIATE rec_show_connections.sqlstatement;
end loop;
或
sqlstr = 'BEGIN ';
for rec_show_connections in cur_show_connections loop
sqlstr := sqlstr || dbms_output.put_line(rec_show_connections.sqlstatement) || '; ';
end loop;
sqlstr := sqlstr || ' END;'
EXECUTE IMMEDIATE sqlstr;
根据您可能需要断开连接的会话数量,第一个选项不太可能出现字符串大小限制问题。PL/SQL有32K的限制,这可能会影响单个PL/SQL连接块的大小,如果您试图一次杀死太多会话,可能会引发错误。