7

谁能解释一下我的 12c 笔记本电脑安装可能有什么问题导致以下问题?

简而言之:我在架构中创建的所有代码都在那里并且可以执行,但不能在任何 IDE 中或通过 dba_source 查看或编辑。

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

我在笔记本电脑上安装了 Oracle Database 12c Enterprise Edition 12.1.0.1.0 64bit。
1 容器数据库。
1 可插拔数据库。

当我在任何 IDE(pl/sql developer.sql developer,...)中登录我的可插入数据库时​​,我的所有对象都在所选 IDE 的“浏览器”中可见。
但是,当我尝试打开(查看源代码)基于 plsql 的对象(如包/过程/函数/类型)时,我不能。
一个例外是触发器。可以查看和编辑它们。
plsql developer (10.0.5.1710) 告诉我(例如):“/* PACKAGE 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 帐户无法直接查询这些视图)
我知道,我知道,我永远不应该这样登录,但是,数据库已启动; -) 所以,我想这永远不会

SYS@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 语句中选择会发生什么

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.  

荷兰州有些东西很烂:-(

4

2 回答 2

2

上周我有幸有机会与 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。问题消失了。所以看起来汤姆是对的(再一次)。

于 2015-02-15T16:09:25.590 回答
0

老实说,我从未听说过这样的问题,我无法重现它。所以,我不能告诉你奇怪行为的原因。

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

替代 user_source 来获取你的程序的源代码,你能试试dbms_metadata-

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

看看你是否能得到一些结果会很有趣。

于 2015-01-10T22:19:58.847 回答