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 连接块的大小,如果您试图一次终止太多会话,则可能会引发错误。
我正在尝试编写一个结束会话的脚本。我在尝试立即执行时收到 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 连接块的大小,如果您试图一次终止太多会话,则可能会引发错误。