为什么Oracle 12c的数据字典中缺少我的plsql代码?

埃里克·范·鲁恩

谁能说明我的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开发人员(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#,类型和子名称是什么(子句中的内容)?

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.  

荷兰的州有些烂:-(

埃里克·范·鲁恩

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

他的回答很简单:“也许什么也没有”。他解释说12.1.0.1在数据字典视图中有几个错误,因为突然之间,他们不得不从容器数据库中获取一部分数据,而从插入式数据库中获取一部分数据。因此,汤姆得出结论,我可能遇到了一个软管错误。

不过,由于没有人可以确认这种行为,并且由于我无法想象自己是唯一使用12.1.0.1数据库的人,因此我认为我所做的某些事情触发了该错误。

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

编辑25/02:

上周末按照与我用于12.1.0.1。完全相同的步骤卸载了12.1.0.1并安装了12.1.0.2。问题消失了。所以看起来汤姆是对的(再次)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么许多表ORACLE默认使用12c?

为什么“描述”命令在oracle 12c的netbeans中不起作用

oracle 12c中缺少右括号

为什么我不能在 jdbc 中插入 oracle?

为什么Oracle的Java教程代码返回错误?

为什么我不能直接转到Oracle登录页面?

为什么导入后Oracle锁定了我的架构的统计信息?

为什么 Tableau 不接受我的初始 SQL (Oracle)?

为什么我们需要分析oracle表

为什么oracle数据库不存储表值?

Cloud Foundry数据源超时Oracle JDBC为什么?

为什么这么慢地从Oracle外部表返回数据?

为什么Oracle中的嵌套聚合函数需要GROUP BY

为什么在Oracle中无法正常工作的情况

为什么NOT IN不总是与Oracle中的MINUS检索相同的结果?

为什么在Oracle中需要一个普通帐户?

为什么 nvl 在 oracle 的 concat 函数中不起作用?

为什么我的 PHP 代码将 Oracle 数据库中的 NULL 实体识别为未识别索引?

如何从Oracle的数据字典中检索数据?

如何在Oracle中刷新数据字典?

为什么oracle用户定义函数在Oracle Sql Developer 4.0.3.16中显示错误

为什么我无法在 Java 中访问 Point2D 的数据字段?

CAPL:为什么我没有在 CAPL 中接收到 CAN 消息的数据字节?

为什么我收到“找不到数据”在Oracle错误住,即使我有数据满足我的条件是什么?

我看不到我在docker上提出的oracle 12c数据库中在SQL Developer中的sqlplus中对sqlplus所做的更改

为什么perl DBI为什么在准备好的语句(Oracle)中添加特殊字符<*>(小于星号大于)?

我的代码中缺少什么

为什么JpaRepository.findAll()方法从Oracle数据库中获取错误的数据?

为什么Cookie或传递给PHP的数据字符串中缺少“ +”字符,以及如何解决这个问题