7

私の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.  

オランダの州には何か腐ったものがあります:-(

4

2 に答える 2

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 に答える