为什么我的plsql代码在Oracle 12c中的数据字典中丢失?

问题描述 投票:7回答:3

[谁能说明我的12c笔记本电脑安装可能出了什么问题并导致以下问题吗?

简而言之:我在架构中创建的所有代码均已存在并且可以执行,但是无法在任何IDE中或通过dba_source查看或编辑。

首先:尽管我对DBA有所了解,但我不是DBA,也永远不会。我是Oracle开发人员。因此,我在安装12c时本可以做各种愚蠢的事情。

我已经在笔记本电脑上安装了64位Oracle Database 12c企业版12.1.0.1.0。1容器数据库。1个可插入数据库。

[当我在任何IDE中登录我的可插入数据库时​​(pl / sql开发人员。sql开发人员,...),我所有的对象都在所选IDE的”浏览器”中可见。但是,当我尝试打开(查看源代码)基于plsql的对象(例如包/过程/函数/类型)时,我无法打开。触发器是一个例外。可以查看和编辑它们。plsql开发人员(10.0.5.1710)告诉我(例如):“ / *包ERO $ UTL的来源不可用* /”sql developer(4.0.3.16)仅向我显示:“创建或替换”。

但是,这些对象可以正常使用。

起初我以为“ plsql开发人员尚未准备好使用12c”但是后来我看到sqldev做了同样的事情,所以...

我检查了数据库/数据库本身。

我创建一个简单的过程:

ERO@EVROCS>CREATE OR REPLACE PROCEDURE hi_there  
  2  AS  
  3  BEGIN  
  4    dbms_output.put_line ('Hello World');  
  5  END;  
  6  /  

Procedure created.  

到目前为止,一切都很好。它存在并且起作用吗?

ERO@EVROCS>exec hi_there  
Hello World  

PL/SQL procedure successfully completed.  

显然是的。

现在,user_objects是否知道其存在?

ERO@EVROCS>SELECT object_name||' - '||object_type   object  
  2  FROM   user_objects  
  3  WHERE  object_name = 'HI_THERE';  

OBJECT  
-----------------------------------------------------------  

HI_THERE - PROCEDURE  

1 row selected.  

是的!大!现在,告诉我它的来源

ERO@EVROCS>SELECT *  
  2  FROM   user_source  
  3  WHERE  name = 'HI_THERE'  
  4  ;  

no rows selected  

对不起?我拼错名字了吗?

ERO@EVROCS>SELECT *  
  2  FROM   user_source  
  3  ;  

no rows selected  

没有

dba_source也不显示任何我的来源:

ERO@EVROCS>SELECT DISTINCT  
  2         owner  
  3  FROM   dba_source  
  4  order by owner  
  5  ;  

OWNER  
-------------------------------  

APEX_040200  
CTXSYS  
DBSNMP  
DVF  
DVSYS  
FLOWS_FILES  
GSMADMIN_INTERNAL  
LBACSYS  
MDSYS  
OLAPSYS  
ORACLE_OCM  
ORDPLUGINS  
ORDSYS  
OUTLN  
SYS  
SYSTEM  
WMSYS  
XDB  

18 rows selected.  

我迷路了


新信息:

我认为这与问题无关,但无论如何我都应该提到它:它在Windows笔记本电脑上运行。Windows 8.1更精确。

@ Lalit您似乎在这里有一点。dbms_metadata正确产生了我所有对象的代码。

ERO@EVROCS>SELECT dbms_metadata.get_ddl ('PROCEDURE'  
  2                               ,'HI_THERE'  
  3                               ,'ERO'  
  4                               )         statement  
  5  FROM dual;  

STATEMENT  
---------------------------------------------------------------  
  CREATE OR REPLACE EDITIONABLE PROCEDURE "ERO"."HI_THERE"  
AS  
BEGIN  
  dbms_output.put_line ('Hello World');  
END;  

1 row selected.  

1但是以某种方式,数据字典视图看不到我的代码。

@ all研究这些观点,它总是很奇怪。以下内容摘要:dba_source不知道我的代码是否存在,但是构成dba_source的源代码可以!拉里以神秘的方式行动!

dba_source的来源是:

CREATE OR REPLACE  
VIEW dba_source  
AS  
SELECT OWNER, NAME, TYPE, LINE, TEXT, ORIGIN_CON_ID  
FROM   INT$DBA_SOURCE  
;  

非常简单:只需从视图INT $ DBA_SOURCE中选择每一行。因此,如果视图有任何问题,则必须在此视图中(或更深层)。

让我们查询该视图,以PDB上的SYSTEM AS SYSDBA身份登录(因为显然我的ERO帐户无法直接查询这些视图)我知道,我应该这样登录,但是,数据库已启动;-)因此,我猜这是neverSYS@EVROCS>SELECT s.text 2 FROM INT$DBA_SOURCE s 3 WHERE s.name = 'HI_THERE' 4 ORDER BY s.line 5 ; no rows selected

确定,如预期。因为这基本上与dba_source相同。INT $ DBA_SOURCE视图有什么作用? 

CREATE OR REPLACE VIEW int$dba_source (owner ,name ,type ,type# ,line ,text ,sharing ,origin_con_id ) AS 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 ;

好!我明白了因此,基本上是从用户到对象,再从那里到源的联接。然后该对象需要是某种类型的。也许我的物体的“类型”是错误的?第一个问题,我的用户是什么#

SYS@EVROCS>SELECT u.user# 2 FROM sys.user$ u 3 WHERE u.name = 'ERO' 4 ; USER# --------------- 111 1 row selected.

我有一个用户号码,因此我是...现在该对象是否存在,如果存在,则它的obj#,类型和子名(where子句中的内容)是什么? 

SYS@EVROCS>SELECT o.obj# 2 , o.name 3 , o.type# 4 , NVL(o.subname,'<<NULL>>') subname 5 FROM sys."_CURRENT_EDITION_OBJ" o 6 WHERE o.owner# = 111 7 AND o.name = 'HI_THERE' 8 ; OBJ# NAME TYPE# SUBNAME ------ --------- ----- --------- 97193 HI_THERE 7 <<NULL>> 1 row selected.

是的,它存在。类型/子名称组合是where子句除外的组合。因此,问题必须出在sys.source $中。显然,没有人提供资源。

SYS@EVROCS>SELECT s.source 2 FROM sys.source$ s 3 WHERE s.obj# = 97193 4 ORDER BY s.line 5 ; SOURCE --------------------------------------------- PROCEDURE hi_there AS BEGIN dbms_output.put_line ('Hello World'); END; 5 rows selected.

什么????源在那儿。我刚刚检查了视图源的每个部分。并检查确定。因此,视图的select语句应产生过程的源代码。但是,如果需要,也应该从视图中进行选择。 

因此,尽管我知道它不能提供我的源代码(因为该视图不提供),但是如果我从作为视图源的select语句中进行选择,我将检查会发生什么情况。>

SYS@EVROCS>SELECT SOURCE 2 FROM ( 3 SELECT u.name u_name 4 , o.name o_name 5 , DECODE(o.type# 6 , 7, 'PROCEDURE' 7 , 8, 'FUNCTION' 8 , 9, 'PACKAGE' 9 ,11, 'PACKAGE BODY' 10 ,12, 'TRIGGER' 11 ,13, 'TYPE' 12 ,14, 'TYPE BODY' 13 ,22, 'LIBRARY' 14 ,87, 'ASSEMBLY' 15 ,'UNDEFINED' 16 ) 17 , o.type# 18 , s.line 19 , s.source 20 , DECODE(bitand(o.flags, 196608) 21 ,65536 , 1 22 ,131072, 1 23 ,0 24 ) 25 , TO_NUMBER(sys_context('USERENV', 'CON_ID')) u_env 26 FROM sys."_CURRENT_EDITION_OBJ" o 27 , sys.source$ s 28 , sys.user$ u 29 WHERE o.obj# = s.obj# 30 AND o.owner# = u.user# 31 AND ( o.type# IN (7, 8, 9, 11, 12, 14, 22) 32 OR ( o.type# = 13 33 AND o.subname IS NULL 34 ) 35 ) 36 UNION ALL 37 SELECT u.name 38 , o.name 39 , 'JAVA SOURCE' 40 , o.type# 41 , s.joxftlno 42 , s.joxftsrc 43 , DECODE(bitand(o.flags, 196608) 44 ,65536 , 1 45 ,131072, 1 46 ,0 47 ) 48 , TO_NUMBER(sys_context('USERENV', 'CON_ID')) 49 FROM sys."_CURRENT_EDITION_OBJ" o 50 , x$joxscd s 51 , sys.user$ u 52 WHERE o.obj# = s.joxftobn 53 AND o.owner# = u.user# 54 AND o.type# = 28 55 ) 56 WHERE o_name = 'HI_THERE' 57 ORDER BY line 58 ; SOURCE ---------------------------------------------------------------------- PROCEDURE hi_there AS BEGIN dbms_output.put_line ('Hello World'); END; 5 rows selected.

在荷兰州,有些东西烂了:-(

[谁能说明我的12c笔记本电脑安装可能出了什么问题并导致以下问题吗?简而言之:我在架构中创建的所有代码均已存在并且可以执行,...

上周,我很幸运有机会与汤姆·凯特(Tom Kyte)交谈。既然他是AskTom的汤姆,我就是这样做的:我问他这个问题。我解释了我上面写的内容,然后问他:“我做错了什么?”

他的回答很简单:“大概什么也没有。”他解释说12.1.0.1在数据字典视图中有几个错误,因为突然之间,他们必须从容器数据库中获取一部分数据,并从插入的数据库中获取一部分数据。因此,汤姆断定我可能遇到了一个软管虫。

仍然,因为没有人可以确认此行为,并且由于我无法想象自己是唯一使用12.1.0.1数据库的人,所以我认为一定有某些事情引起了这个bug的引起注意。

无论如何,现在我已经确定问题可能出在产品内,我将停止进一步研究它,并将其升级到12.1.0.2。现在,如果升级使问题消失了,我将确信在我重复12.1.0.1的愚蠢之后一周后它不会再次出现。

编辑25/02:

上周末按照与我在12.1.0.1。中使用的完全相同的步骤卸载了12.1.0.1,并安装了12.1.0.2。问题消失了。这样看来汤姆是对的(再次)。

老实说,我从未听说过这样的问题,我无法复制它。因此,我无法告诉您这种怪异行为的原因。

但是,您可以看到trigger代码,但其他PL/SQL代码除外,我确信user_source视图可能存在问题。由于触发器不包含在*_source视图中。我搜索了MOS,无法资助与您的问题有关的任何事情。

替代user_source来获取您的过程的源代码,请您尝试dbms_metadata-

从双中选择dbms_metadata.get_ddl('PROCEDURE','PROCEDURE_NAME','USERNAME');

很高兴看到您是否得到一些结果。

我们使用的是12.1.0.2.0-64位(rhel6),出现了相同的问题。有什么决议吗?甲骨文尚未回应。
database plsql oracle-sqldeveloper oracle12c data-dictionary
3个回答
2
投票
上周,我很幸运有机会与汤姆·凯特(Tom Kyte)交谈。既然他是AskTom的汤姆,我就是这样做的:我问他这个问题。我解释了我上面写的内容,然后问他:“我做错了什么?”

0
投票
老实说,我从未听说过这样的问题,我无法复制它。因此,我无法告诉您这种怪异行为的原因。

但是,您可以看到trigger代码,但其他PL/SQL代码除外,我确信user_source视图可能存在问题。由于触发器不包含在*_source视图中。我搜索了MOS,无法资助与您的问题有关的任何事情。


0
投票
我们使用的是12.1.0.2.0-64位(rhel6),出现了相同的问题。有什么决议吗?甲骨文尚未回应。
© www.soinside.com 2019 - 2024. All rights reserved.