oracle,存储过程报错,实现杀掉死锁进程,求大牛

create or replace procedure postxnDayCut (dates varchar2)
is
sqlText varchar2(2000);
process_sid number(10);
process_serial number(10);
nums number;
cursor process_cursor is select t.sid,t.serial# from v$session t where sid in (select sid from v$lock where id1 in
(select object_id from dba_objects where object_name=upper('t_posp_txn')));--要对系统表分配权限
begin
--循环杀掉正在占用的所有进程。
FOR t IN process_cursor LOOP
begin
process_sid:=t.sid;
process_serial:=t.serial#;
sqlText:= q'(alter system kill session 'process_sid,process_serial')';--转义
execute immediate sqlText;
end;
end loop;

sqlText:= 'grant create table to btupayprovince';
execute immediate sqlText;
--删除临时表
sqlText:= 'truncate table t_posp_txn_tmp';
execute immediate sqlText;
sqlText:= 'drop table t_posp_txn_tmp';
execute immediate sqlText;

报错显示16行,杀进程sql的execute那里。

报错显示:
ORA-00026: 丢失或无效的会话 ID
ORA-06512: 在 "BTUPAYPROVINCE.POSTXNDAYCUT", line 16
ORA-06512: 在 line 3

查看错误堆栈的程序源?

求人解答,在这篇帖子看到同样的问题,http://bbs.csdn.net/topics/360265084
但依然没看见有价值的信息。
如果是转换为变量,我也用了,但还是报错。。

另外我在csdn提问的帖子:http://bbs.csdn.net/topics/391050145?page=1#post-399315385
100分的问题,隔了一天没人回复。。。
知道的那边分也带走吧。。
就这么多吧,求高人。。知道没那么多分了。。谢谢了先。。。

估计你SQL 拼接错了吧,建议打印一下;

我的测试过程;

--新建一个会话窗口,挂起一个会话;
SQL> create table test(col varchar2(20));
Table created
SQL> insert into test values('test');
1 row inserted 
--再新建一个会话窗口,杀掉锁定test表的会话
SQL> declare
  2  begin
  3    for vref in (select t.sid, t.serial#
  4                   from v$session t
  5                  where sid in
  6                        (select sid
  7                           from v$lock
  8                          where id1 in
  9                                (select object_id
 10                                   from user_objects t
 11                                  where object_name = upper('test')))) loop
 12      execute immediate 'alter system kill session  ''' || vref.sid || ',' ||
 13                        vref.serial# || '''';
 14    end loop;
 15  end;
 16  /
PL/SQL procedure successfully completed
SQL> 
SQL> select t.sid, t.serial#
  2                   from v$session t
  3                  where sid in
  4                        (select sid
  5                           from v$lock
  6                          where id1 in
  7                                (select object_id
  8                                   from user_objects t
  9                                  where object_name = upper('test')))
 10  /
       SID    SERIAL#
---------- ----------
SQL>

追问

大哥,你好牛哇,确实是转义 ’ 时候拼接错了,正确格式是q'{}' ,不是小括号。。用‘ 转义也可以。实在是非常高感谢。。

温馨提示:答案为网友推荐,仅供参考