暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle编译多种类型的失效对象

原创 陈坤 云和恩墨 2022-03-22
2026

测试PDB迁移从19.4迁移到19.10时,遇到有2500多个同义词synonym 的时候,执行

ORACLE_HOME/rdbms/admin/utlrp.sql 

也无法重新编译过去


再次尝试使用

对 owner 为 PUBLIC的 synonym 使用:

alter PUBLIC synonym "object_name" conpile;

对 owner为其他的 synonym使用:

alter synonym "owner"."object_name" compile;


编译时,会报错并把当前连接踢出PDB


检查alert日志发现又报错:

ORA-7445[csyalt()+10xx] xxxx

的报错。去mos上查询,发现在升级之后确实可能出现这个问题,给出的解决方案是

exec dbms_pdb.exec_as_oracle_script('CREATE OR REPLACE PUBLIC SYNONYM <PACKAGE_NAME> FOR SYS.<PACKAGE_NAME>');


对于非PUBLIC的同义词,可以使用:


exec dbms_pdb.exec_as_oracle_script('CREATE OR REPLACE SYNONYM "owner"."object_name" for "owner"."object_name" ');


其实相当于重建了这些同义词


拼接命令:


public 的同义词

select 'exec dbms_pdb.exec_as_oracle_script(''CREATE OR REPLACE PUBLIC SYNONYM "'||OBJECT_NAME||'" FOR SYS."'||OBJECT_NAME||'"'');' from dba_objects

where status='INVALID' and OBJECT_TYPE='SYNONYM' and owner='PUBLIC';


其他用户的同义词

select 'exec dbms_pdb.exec_as_oracle_script(''CREATE OR REPLACE SYNONYM "'||OWNER||'"."'||OBJECT_NAME||'" FOR "'||OWNER||'"."'||OBJECT_NAME||'"'');' from dba_objects

where status='INVALID' and OBJECT_TYPE='SYNONYM' and owner='PUBLIC';


MOS:

https://support.oracle.com/epmos/faces/SearchDocDisplay?_afrLoop=49092229135794&_afrWindowMode=0&_adf.ctrl-state=tf6v29wda_4


编译其他失效对象:


查询失效对象

select owner, object_type, status from dba_objects where status='INVALID';


编译其他失效对象:

alter package "<schema name>"."<package_name>" compile;

alter package "<schema name>"."<package_name>" compile body; 这里注意要加body

alter view "<schema name>"."<view_name>" compile;

alter trigger "<schema>"."<trigger_name>" compile;

...

加引号的原因是,因为有可能有的失效对象是带着路径的


拼接语句:

select 'alter '||OBJECT_TYPE||' '||OWNER||',"'||OBJECT_NAME||'" compile;' from dba_objects where status='INVALID' and OBJECT_TYPE='XXX';


这种语法编译的失效对象类型有:

package ,package body(注意compile后面还要拼接一个body),procedure, type,trigger,view,function,materialized view。


编译type body

exec dbms_pdb.exec_as_oracle_script(''alter type OWNER."OBJECT_NAME" compile body'');


拼接语句:

select 'exec dbms_pdb.exec_as_oracle_script(''alter type '||OWNER||'."'||OBJECT_NAME||'" compile body'');' from dba_object where status='INVALID' and OBJECT_TYPE in ('TYPE BODY');

最后修改时间:2022-03-23 09:19:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论