私の12cラップトップのインストールで何が問題なのか、次の問題を引き起こす可能性があることに誰かが光を当てることができますか?
要するに、スキーマで作成したすべてのコードはそこにあり、実行できますが、IDE や dba_source を介して表示または編集することはできません。
まず第一に、私は DBA ではありませんし、今後もそうなるつもりはありませんが、DBA についてある程度は理解しています。
私はオラクルの開発者です。そのため、12c のインストール中にあらゆる種類のばかげたことを実行できた可能性があります。
ラップトップに Oracle Database 12c Enterprise Edition 12.1.0.1.0 64 ビットをインストールしました。
1 コンテナー データベース。
1 プラグ可能なデータベース。
任意の IDE (pl/sql 開発者、sql 開発者、...) でプラグ可能なデータベースにログインすると、選択した IDE の「ブラウザ」にすべてのオブジェクトが表示されます。
ただし、パッケージ/プロシージャ/関数/タイプなどの plsql ベースのオブジェクトを開こう (ソースを表示) しようとすると、できません。
例外はトリガーです。それらは表示および編集できます。
plsql 開発者 ( 10.0.5.1710
) は (たとえば) 教えてくれます: 「/* PACKAGE ERO$UTL のソースは利用できません */」
ただし、オブジェクトは通常どおり使用できます。
最初は「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しかし、どういうわけか、datadictionary ビューに私のコードが表示されません。
@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
;
Ok!
私はこれを取得します。したがって、基本的には、ユーザーからオブジェクトへの結合、およびそこからソースへの結合です。
そして、オブジェクトは何らかのタイプである必要があります。
私のオブジェクトの「タイプ」が間違っているのでしょうか?
最初の質問は私のユーザーです#
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.
何????
ソースはそこにあります。
ビューソースのすべての部分をチェックしました。そして、それはOKをチェックアウトします。
したがって、ビューの選択ステートメントは、私の手順のソースを生成する必要があります。
しかし、もしそうなら、ビューからの選択もすべきです。
したがって、ソースコードを取得できないことはわかっていますが (ビューが取得できないため)、ビューのソースである 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.
オランダの州には何か腐ったものがあります:-(