execute immediate reward为什么对alter无效

- 基于CPU_COUNT参数设置并行度.1 - 以串行方式編译对象,一次编译一个.N - 以N个并行度进行编译.脚本需要以sys用户或者有sysdba权限的用户来运行

当我们进行Oracle数据库恢复或数据库遷移后很多时候会遇到对象失效的问题,由于这些对象是受一些Oracle用户的授权操作或某些系统对象影响当我们还没创建好这些用户或对潒前,导入后会出现大部分存储过程函数,视图等对象失效现象如果这些对象数量比较多,手工逐一编译会很耗时间下面分享一个存储过程,可批量对整个Oracle数据库实例进行失效对象重编译:

–首先创建自动编译失效过程事务记录表

–然后创建编译失效对象的存储过程

–然后调用即可也可以创建定时任务计划,每天早上8点整执行该任务且保证此任务有且只有一个,这样可以针对一些批量数据导入任務后保证数据库对象无失效对象:

Oracle生产中跑批存储过程或函数失效原因分析以及解决方案:

1.当我们编译存储过程或函数时,该过程或函数引用的所有Oracle对象都将记录在数据字典中

该过程就依赖于这些存储的对潒。我们可以看到在数据字典中显示了标志为非法的有编译错误的子程序

同样,如果一个DDL操作运行在其所相关的对象上时,存储子程序也將是非法的当对象变更时,其相关的对象就会变成非法对象

如果所有的对象都在同一个数据库中的话,则相关的对象将会在底层对象變更的同时进入非法状态由于数据字典在不断地跟踪对象间的相关,所以这种变化可以快速反应出来

2.为什么在远程调用下的过程看起來有所不同呢?

答案就在于数据字典并不跟踪远程相关对象实际上,由于远程对象可能位于不同的数据库中因此要将所有相关远程对潒作废实际上是不可能的(如果远程对象处于无效期的话,数据字典可能无法对其进行访问)与上不同的是,远程对象的合法性要在运荇时进行检查

1.过程所引用的对象失效,例如:表结构变更

查看编译过程中的报错信息

在调用存储过程之前,增加对过程的编译语句:

为了能够执荇此命令,需要拥有这个过程或者具有alter any procedure系统权限。

为了能够执行需要拥有此函数,或者具有alter any procedure系统权限

为了能够执行,需要拥有此包或者具有alter any procedure系统权限。

可以使用各自的Create or replace命令来替换过程函数和包。

使用or replace子句保留了这些对象已被赋予的权限。

我要回帖

更多关于 immediate reward 的文章

 

随机推荐