谁能解释一下我的 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.
荷兰州有些东西很烂:-(