今天同事修改Oracle存储过程又导致2个过程无法被编译,流程规范上的东西,Dave 这里不多说,看看怎么解决问题。
1. 查看无效对象
XEZF@xezf(qs-xezf-db1)> select object_name,object_type,status from all_objects where status='INVALID' and owner='XEZF';
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------------------------- -------
PROC_OB_TO_XEZF PROCEDURE INVALID
PROC_JOB_OB_WRITE PROCEDURE INVALID
以上是2个不能编译的过程,我们查看使用这2个过程的session:
2. 查看正在访问无效对象的session:
这里我们使用 v$access 视图:
V$ACCESS displaysinformation about locks that are currently imposed on library cache objects.The locks are imposed to ensure that they are not aged out of the library cachewhile they are required for SQL execution.
XEZF@xezf(qs-xezf-db1)> Select * from v$access where object='PROC_OB_TO_XEZF';
SID OWNER OBJECT TYPE
---------- -------------------------------- ------------------------
958 XEZF PROC_OB_TO_XEZF PROCEDURE
XEZF@xezf(qs-xezf-db1)> Select * from v$access where object='PROC_JOB_OB_WRITE';
SID OWNER OBJECT TYPE
---------- -------------------------------- ------------------------
958 XEZF PROC_JOB_OB_WRITE PROCEDURE
从以上查询结果,是958的session 在使用。
3. 查看session 状态:
XEZF@xezf(qs-xezf-db1)> select sid,serial#,status,process from v$session where sid='958';
SID SERIAL# STATUS PROCESS
---------- ---------- -------- ------------
958 8350 KILLED 24007
从以上结果看,这个session 已经被标记为killed状态了。 被标记为killed 的进程由PMON 进程kill,但是这个也是有条件的:
PMON will notdelete the session object itself until the client connected to that sessionnotices that it has been killed.
如果session 被标记为killed,并且长时间不能被清楚,MOS上给出的解决方法是在OS级别kill 进程。 这个问题会另篇Blog 进行说明。
4. 获取session 对应的SPID
XEZF@xezf(qs-xezf-db1)> select spid,osuser, s.program
2 from v$session s,v$process p
3 where s.paddr=p.addr and s.sid=958;
--指定session的SID
SPID OSUSER PROGRAM
------------ ------------------------------------------------------------------
24007 oracle oracle@qs-xezf-db1 (J004)
在Linux 平台下,我们就可以直接kill 这个进程了:
#kill -9 24007
5. Kill 进程
如果等PMON来清理这个进程可能需要很长时间,所以这里我们手工的kill 进程。 在OS级别进行操作:
[oracle@qs-xezf-db1 ~]$ ps -ef|grep 24007
oracle 10031 9299 0 17:39 pts/2 00:00:00 grep 24007
oracle 24007 1 0 Mar29 ? 00:00:01 ora_j004_xezf
[oracle@qs-xezf-db1 ~]$ kill -9 24007
[oracle@qs-xezf-db1 ~]$ ps -ef|grep 24007
oracle 10361 9299 0 17:54 pts/2 00:00:00 grep 24007
进程已经被kill掉了。
验证session:
XEZF@xezf(qs-xezf-db1)> select sid,serial#,status,process from v$session where sid='958';
SID SERIAL# STATUS PROCESS
---------- ---------- -------- ------------
958 8357 INACTIVE 1234
在次就可以成功编译无效的过程了。
XEZF@xezf(qs-xezf-db1)>select object_name,object_type,status from all_objects where status='INVALID' and owner='XEZF';
no rows selected
问题解决。
相关推荐
Oracle 存储过程编译 Oracle 存储过程编译是指在 Oracle 数据库中编译存储过程的过程。存储过程是一种预编译的 SQL 语句集合,用于实现特定的业务逻辑。编译存储过程是将其转换为机器代码,以提高执行速度和效率。 ...
linux系统中使用shell脚本对oracle存储过程进行编译
本文将深入探讨可能导致Oracle存储过程编译错误的一些常见原因及解决方案。 1. **语法错误**:这是最常见的问题,可能包括括号不匹配、拼写错误、关键字使用不当等。解决方法是仔细检查代码,确保所有语句都符合PL/...
Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储...
针对上述问题,可以采取以下几种方法来解决存储过程被锁无法编译的问题: 1. **查找锁定源**: - 使用以下SQL语句查询锁定存储过程的会话信息: ```sql SELECT DISTINCT s1.* FROM V$DB_OBJECT_CACHE oc, v$...
总结起来,"帆软报表Oracle存储过程解决storeParameter1参数试用插件"主要是针对在调用无参数Oracle存储过程时出现的异常问题提供的一种解决方案。通过安装并配置这个插件,用户可以顺利地在帆软报表中调用不包含...
### Oracle存储过程 存储过程是在数据库中预编译的一组SQL语句,用于执行复杂的业务逻辑或数据操作。它们可以接受输入参数,执行一系列数据库操作,并返回结果。在Oracle中,存储过程使用PL/SQL编写,可以在数据库...
以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...
oracle数据库存储过程反编译和异常使用的检测方法.pdf
Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写一系列SQL语句和PL/SQL块,形成可重复使用的代码单元。这篇博客“oracle存储过程-帮助文档”可能提供了关于如何创建、调用和管理Oracle存储过程...
本文主要介绍了Oracle存储过程的概念、创建和调用方法,以及如何使用DBLink实现跨库操作。存储过程提供了强大的数据库处理能力,而DBLink则使得不同数据库实例之间的交互变得更加方便和高效。掌握这些技术对于提高...
Oracle存储过程是数据库管理系统Oracle中的一个关键特性,它允许开发者编写一组预编译的SQL和PL/SQL语句,以实现特定的业务逻辑或数据库操作。这篇教程将深入讲解Oracle存储过程的各个方面,帮助你从基础到高级全面...
**一、Oracle存储过程** 存储过程是一组预编译的SQL语句和PL/SQL代码,存储在数据库服务器上,可以按需调用。存储过程的优点包括提高性能、减少网络流量、增强安全性以及实现模块化编程。 1. **创建存储过程**:...
以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....
Oracle存储过程则是在Oracle数据库中预编译的一系列SQL和PL/SQL语句,可以视为数据库端的可执行代码。 在描述中提到的“使用批处理进行oracle存储过程脚本的创建和更新的处理”,这可能意味着开发者使用批处理命令...
Oracle存储过程是数据库编程的重要组成部分,它允许程序员在数据库中执行复杂的业务逻辑和数据操作。这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,...
### Oracle存储过程批量提交知识点详解 在Oracle数据库中,存储过程是一种重要的数据库对象,它可以包含一系列SQL语句和控制流语句,用于实现复杂的业务逻辑处理。存储过程不仅可以提高应用程序性能,还可以确保...
在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...
Oracle存储过程是数据库管理系统Oracle中的一种重要特性,用于封装一系列SQL和PL/SQL代码,以实现特定的功能。在Oracle中,存储过程可以提高应用程序的性能,因为它减少了与数据库的交互次数,并允许在数据库级别...
### Oracle存储过程学习经典 #### Oracle存储过程基础知识与实践 Oracle存储过程是SQL与PL/SQL结合的强大功能,用于封装复杂的数据操作逻辑于数据库内部,从而实现高效的事务处理和数据管理。以下是对Oracle存储...