Gblog

おもにTips

SQLのキャンセル。シングルだけど。

準備、準備。

grant connect,resource to g identified by g;
grant select any dictionary to g;
conn g/g

 

とりあえず、spidとかメモ

col spid for a10
select spid, s.sid, s.serial# from v$session s , v$process p where p.addr=s.paddr and s.username='G';

 

で、SQL実行

select count(*) from v$parameter a, v$parameter b,v$parameter c;

 

リソース喰うので注意。

 

別ターミナルで SQL_ID 確認

select sql_id from v$sql where sql_text like 'select count(*) from v$p%';

 

まずは、cancel sql

alter system cancel sql '237, 54442, 0asad88p5kv1p';

 

これで SQL をキャンセルできる。

 

cancel されたセッションには以下のようなエラー。

でもセッションは切れてない。

SQL> select count(*) from v$parameter a, v$parameter b,v$parameter c;
select count(*) from v$parameter a, v$parameter b,v$parameter c
                     *
ERROR at line 1:
ORA-01013: user requested cancel of current operation


SQL> 
SQL> select * from dual;

DUM
---
X

セッション kill するとkillされたセッションにエラーはでないけど、SQL実行すると ORA-28

SQL> r
  1* select * from dual
select * from dual
*
ERROR at line 1:
ORA-00028: your session has been killed


SQL>

 

まあ、エラーがでるかどうかはプロセスの除隊次第だけど。

cancel sql だとセッションは切れないので、クライアント側のエラーハンドリング次第では、継続して処理が実行できる、ということになる。たぶん。

 

ちょっと微妙。