oracle 存储过程总是在编译,高手急救!

知秋落雨 2010-05-12 11:56:57
今天碰到一个问题很棘手,我更改了存储过程,只是添加个注释,但是存储过程编译就一直在执行,我也不知道具体看那里出错了,看V$SESSION,V$SESSION_WAIT,V$LOCKED_OBJECT好像都不行,那位高手给个解决的方法!
...全文
861 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
知秋落雨 2010-05-17
  • 打赏
  • 举报
回复
找到原因了,是我自己的游标的问题,谢谢各位大虾了,但是我不知道把自己的分给谁了,
palm_civet 2010-05-16
  • 打赏
  • 举报
回复
一般是有人在用,比如debug停在那里了

还有一种情况,看一下服务器是否满负荷运行,杀掉占用cpu较高的进程
speedin 2010-05-15
  • 打赏
  • 举报
回复
看你的操作系统是什么,因为有时候你查看SESSION状态时KILLED的话,其实在系统中是还有进程在调用的。一般UNIX系统的话,可用下面方式解决。

1、查看对象是否在调用中:

select * from v$access
where object ='过程名或过程所在的包名';


2、查调用过程的系统进程ID:
--查v$session视图
select sid,serial#,paddr from v$session where sid='第一步中查到的sid';
--查v$process视图
select spid from v$process where addr='刚才查到的paddr';


3.再到操作系统中将对应的SPID进程KILL掉就可以了。
xieyu_zy 2010-05-15
  • 打赏
  • 举报
回复
如楼上所说DDL锁,你可以做一个测试就是当一个过程在运行过程中(你可以用PL/SQL进行断点调试到中间),通途开启另一个SESSION去修改这个过程,肯定会出现和你一样的情况。。。。

此时可能有人在调试过程,可能有程序在调用,类似有些是高频繁调用或者JOB(10秒)调用,而程序几乎执会达到这个周期,此时过程处于一直执行状态,或者有过程在等待一个表的锁没有执行完,如一张表被FOR UPDATE,而过程需要修改这个表的一个字段,就会长期等。


通过dba_ddl_locks 的确可以查询出该对象被锁住(单机版可以),不过在运行时系统我估计你几乎查询不出来数据,每一个瞬间都有N多对象可能被锁住,所以查询的时候基本都定在那里动都不动,掉不出来数据,一般需要将中端关闭掉才行。

如果的确要弄,这种需要排查很多问题,一般可以先把应用程序(可能有多个终端)和JOB停掉,再查询SESSION,将当前用户的干掉(写个循环语句),不要把当前SESSION干掉了,根据登录时间和登录用户过滤。这个时候修改问题不大,不过这个问题是解决掉了,那么要么是程序有点点不对,要么程序员操作习惯不好或者结构设计中将太多分离的东西合并在一起,可以排查一下。。。。
codearts 2010-05-12
  • 打赏
  • 举报
回复
2 种可能:
1) plsql developer的BUG, 重启再编译

2)有别的Session在执行这个SP。可用dba_ddl_locks查看
知秋落雨 2010-05-12
  • 打赏
  • 举报
回复
没有提交?我看看啊,应该不会发生这个问题的吧!我检查下啊,谢谢!
gelyon 2010-05-12
  • 打赏
  • 举报
回复
是不是发生了死锁等待啊?也就是过程中调用到哪个对象没有提交的事务
如果你之前是正确的,现在只是加了个注释,然后再编译,应该没有问题才对。
知秋落雨 2010-05-12
  • 打赏
  • 举报
回复
当然,没有其他的人在用这个存储过程!
codearts 2010-05-12
  • 打赏
  • 举报
回复
ddl锁:

假如有一个SP,我在执行时,就加一个DDL锁。这个DDL锁的作用就是防止别人修改这个SP
-----------------------------------------------------------------------------------
解决方式就是:

3 难道通过dba_ddl_locks 的SID 关联V$SESSION SID,再得到SID,SERIAL#,再通过alter system kill session 'sid,serial#'杀掉?
知秋落雨 2010-05-12
  • 打赏
  • 举报
回复
1 我用的是TOAD ,没有用plsql developer.
2 我想问的是如果dba_ddl_locks 里面存在锁,如何解锁?
3 难道通过dba_ddl_locks 的SID 关联V$SESSION SID,再得到SID,SERIAL#,再通过alter system kill session 'sid,serial#'杀掉?
4 能否告诉我定位到具体的那个存储过程,具体的那张表不?
tangren 2010-05-12
  • 打赏
  • 举报
回复
这个pl/sql developer的问题,强制中止,重启再看一下

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧