[谁能说明我的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笔记本电脑安装可能出了什么问题并导致以下问题吗?简而言之:我在架构中创建的所有代码均已存在并且可以执行,...
他的回答很简单:“大概什么也没有。”他解释说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');
很高兴看到您是否得到一些结果。
但是,您可以看到trigger
代码,但其他PL/SQL
代码除外,我确信user_source
视图可能存在问题。由于触发器不包含在*_source
视图中。我搜索了MOS
,无法资助与您的问题有关的任何事情。