oracle中 kill 正在执行的存储过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中 kill 正在执行的存储过程相关的知识,希望对你有一定的参考价值。
正在执行的存储过程,怎样强行停止?
如果使用kill的话,如何找到该存储过程对应的进程id?
嗯,解决了,通过
select j.*, v.sid, v.serial#, v.PROCESS
from V$session v,
DBA_JOBS_RUNNING R,
DBA_JOBS J where J.WHAT like '%存储过程名%';
查到了进程id。 谢谢大家
select a.SID,a.SERIAL#,a.USERNAME
from sys.v_$session a,sys.dba_objects b,v$locked_object c
where b.object_id = c.OBJECT_ID
and a.SID = c.SESSION_ID
and b.object_name = '表名';
用上面 的语句找到存储过程中主要用插入表的sid 和SERIAL#
然后用下面的语句杀掉。
alter system kill session 'sid ,SERIAL#';
如果杀不掉的话,等所有人释放,或者从启服务。 参考技术A 有个dbarstian软件,可以查看存储过程
在 oracle 中执行存储过程后是不是发生任何自动提交?
【中文标题】在 oracle 中执行存储过程后是不是发生任何自动提交?【英文标题】:Is there any auto commit happens after executing stored procedures in oracle?在 oracle 中执行存储过程后是否发生任何自动提交? 【发布时间】:2015-12-09 15:43:59 【问题描述】:我在 oracle DB 中有 3 个表。我正在编写一个程序来根据某些条件删除所有 3 个表中的某些行。
我在过程中一一使用了所有三个删除语句。在执行上述存储过程时,执行时是否发生了自动提交?
否则,我是否需要在最后手动编码提交?
【问题讨论】:
在 PL/SQL 函数或过程中没有自动提交。 我正在使用 oracle 命令行。在那,我正在执行上述过程。执行完之后,我是否需要手动输入commit命令,因为我在存储过程中使用了delete语句。 【参考方案1】:数据库级别没有自动提交,但您使用的 API 可能具有自动提交功能。 From Tom Kyte.
也就是说,我想补充一下:
除非您正在执行自主事务,否则您应该远离直接在过程中提交:From Tom Kyte。
摘录:
我希望 PLSQL 不支持提交/回滚。我坚信 事务控制必须在最高调用者级别完成。那 是您可以采用这 N 个存储过程并绑定它们的唯一方法 一起交易。
此外,还应该注意的是,对于 DDL(根据您的问题,这听起来不像您在程序中执行任何 DDL,但只是将其列为潜在的陷阱),Oracle 在之前添加了一个隐式提交在 DDL 之后。
【讨论】:
【参考方案2】:没有autocommit
,但是可以在存储过程中设置commit命令。
示例 #1:no commit
create procedure my_proc as
begin
insert into t1(col1) values(1);
end;
当你执行你需要调用的过程时commit
begin
my_proc;
commit;
end;
示例 #2:commit
create procedure my_proc as
begin
insert into t1(col1) values(1);
commit;
end;
当你执行程序时,你不需要调用commit
,因为程序会这样做
begin
my_proc;
end;
【讨论】:
【参考方案3】:在存储过程的范围内没有自动提交。但是,如果您使用的是 SQL Plus 或 SQL Developer,则根据设置自动提交是可能的。
您应该将提交和回滚作为存储过程代码的一部分来处理。
【讨论】:
以上是关于oracle中 kill 正在执行的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
使用 dbms_job 在包内执行 oracle 中的存储过程