在使用PLSQL Developer工具查看业务用户下所有存储过程报ORA-00604,ORA-00942,确认用户权限和表是存在,无失效对象。
通过10046进行追踪
SQL>alter session set events '10046 trace name context forever, level 12';
SQL>select \* from dba\_source;
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942:table or view does not exit
SQL>alter session set events '10046 trace name context off'
Bind#1
oacdty=01 mxl=32(10) mxlc=00 mal=00 scl=00 pre=00
oacflg=10 fl2=0001 frm=01 csi=852 siz=0 off=24
kxsbbbfp=7fb04e2d2fc8 bln=32 avl=10 flg=01
value="DBA\_SOURCE"
CLOSE #140395202554824:c=19,e=18,dep=1,type=1,tim=60072744458961
\=====================
PARSE ERROR #140395202553720:len=475 dep=1 uid=0 oct=3 lid=0 tim=60072744459232 err=942
SELECT /\* DS\_SVC \*/ /\*+ dynamic\_sampling(0) no\_sql\_tune no\_monitoring optimizer\_features\_enable(default) no\_parallel result\_cache(snapshot=3600) \*/ SUM(C1) FROM (SELECT /\*+ qb\_name("innerQuery") NO\_INDEX\_FFS( "MODSEP") \*/ 1 AS C1 FROM " MODSEP " SAMPLE BLOCK(0.0134053, 8) SEED(1) " MODSEP " WHERE ("MODSEP "."ENDTIME" IS NULL) AND ("MODSEP "."EPID"=257975690) AND ("MODSEP "."STEPSTATE"='1' OR " MODSEP P"."STEPSTATE" IS NULL)) innerQuery
\=====================
PARSE ERROR #140395204915568:len=25 dep=0 uid=145 oct=3 lid=145 tim=60072744459291 err=604
select \* from dba\_source
CLOSE #140395202553720:c=1,e=1,dep=1,type=0,tim=60072744459334
WAIT #140395204915568: nam='SQL\*Net break/reset to client' ela= 6 driver id=1413697536 break?=1 p3=0 obj#=-1 tim=60072744459416
WAIT #140395204915568: nam='SQL\*Net break/reset to client' ela= 79 driver id=1413697536 break?=0 p3=0 obj#=-1 tim=60072744459502
WAIT #140395204915568: nam='SQL\*Net message to client' ela= 0 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=60072744459509
\*\*\* 2022-02-09 19:07:51.535
WAIT #140395204915568: nam='SQL\*Net message from client' ela= 6474857 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=60072750934385
CLOSE #140395204915568:c=6,e=5,dep=0,type=0,tim=60072750934457
\=====================
PARSING IN CURSOR #140395204915568 len=56 dep=0 uid=145 oct=42 lid=145 tim=60072750934603 hv=1729844458 ad='0' sqlid='5dt9w7dmjqp7a'
A
从trace文件可以看到MODSEP表,我们检查了该表,表的状态和数据都是正常的。
检查一下这张表是不是在存储过程中
SQL>select \* from dba\_source where upper(text) like '%MODSEP%' order by owner,name,type,line;
No rows selected
存储过程不涉及该表。
确认dba_views中是否存储dba_source
SQL>select text\_vc c100 from dba\_views where view\_name='INT$DBA\_SOURCE';
INT$DBA_SOURCE视图的定义:
SELECT u.name
, o.name
, DECODE(o.type#
, 7, 'PROCEDURE'
, 8, 'FUNCTION'
, 9, 'PACKAGE'
,11, 'PACKAGE BODY'
,12, 'TRIGGER'
,13, 'TYPE'
,14, 'TYPE BODY'
,22, 'LIBRARY'
,87, 'ASSEMBLY'
,'UNDEFINED'
)
, o.type#
, s.line
, s.source
, DECODE(bitand(o.flags, 196608)
,65536 , 1
,131072, 1
,0
)
, TO\_NUMBER(sys\_context('USERENV', 'CON\_ID'))
FROM sys."\_CURRENT\_EDITION\_OBJ" o
, sys.source$ s
, sys.user$ u
WHERE o.obj# = s.obj#
AND o.owner# = u.user#
AND ( o.type# IN (7, 8, 9, 11, 12, 14, 22)
OR ( o.type# = 13
AND o.subname IS NULL
)
)
UNION ALL
SELECT u.name
, o.name
, 'JAVA SOURCE'
, o.type#
, s.joxftlno
, s.joxftsrc
, DECODE(bitand(o.flags, 196608)
,65536 , 1
,131072, 1
,0
)
, TO\_NUMBER(sys\_context('USERENV', 'CON\_ID'))
FROM sys."\_CURRENT\_EDITION\_OBJ" o
, x$joxscd s
, sys.user$ u
WHERE o.obj# = s.joxftobn
AND o.owner# = u.user#
AND o.type# = 28
;
pdb中运行
SQL>select \* from int$dba\_source
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942:table or view does not exit
PDB直接运行INT$DBA_SOURCE’视图中定义的SQL可以返回结果,初步判断是share pool中与内存指向不正确,建议的方案是1、重启CDB和PDB;2、flush 共享池。
避开业务高峰在PDB中执行
SQL> alter system flush shared\_pool;
还是不能查询dba_source
在CDB中执行
SQL> alter system flush shared\_pool;
可以正常查询dba_source了,PL SQL developer功能也可以正常查看业务用户下的存储过程。
-the end-
最后修改时间:2022-03-08 11:37:29
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




