SQL 命令未正确结束以立即执行

SQL Command Not Properly Ended for EXECUTE IMMEDIATE

我正在尝试编写一个结束会话的脚本。我在尝试立即执行时收到 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;

如有任何帮助,我们将不胜感激。

不要以 semi-colon 结束你的 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 连接块的大小,如果您试图一次终止太多会话,则可能会引发错误。