7

누구나 내 12c 노트북 설치에 어떤 문제가 있는지 다음과 같은 문제를 일으킬 수 있는지 확인해주십시오.왜 Oracle 12c의 datadictionary에 내 plsql 코드가 누락 되었습니까?

간단히 말해, 스키마에 작성한 모든 코드가 있으며 실행될 수 있지만 모든 IDE 또는 dba_source를 통해 보거나 편집 할 수 없습니다.

우선 나는 DBA가 아니며, 나는 DBA에 대한 이해를 가지고 있지만 필자도 마찬가지입니다.
저는 Oracle 개발자입니다. 그래서 12c를 설치하는 동안 나는 모든 종류의 어리석은 짓을 할 수있었습니다.

내 노트북에 Oracle Database 12c Enterprise Edition 12.1.0.1.0 64bit를 설치했습니다.
1 컨테이너 데이터베이스.
1 플러그 가능 데이터베이스.

모든 IDE (pl/sql 개발자, sql 개발자 ...)에서 플러그인 가능한 데이터베이스에 로그인하면 모든 IDE 개체가 IDE의 '브라우저'에 표시됩니다.
그러나 패키지/프로 시저/함수/유형과 같은 plsql 기반 객체를 열려고하면 소스를 볼 수 없습니다.
예외가 트리거입니다. 그것들을보고 편집 할 수 있습니다.
"/ * PACKAGE ERO $ UTL 소스를 사용할 수 없습니다. * /"
SQL 개발자 (4.0.3.16)가 "작성 또는 바꾸기"를 표시합니다.

그러나 개체를 정상적으로 사용할 수 있습니다.

내가 데이터베이스/데이터 사전 자체를 확인 ....

은 처음에는
"PLSQL 개발자는 단지 12C 아직 준비가되지 않았습니다"라고 생각하지만 나는 sqldev이 같은 작업을 수행했다, 그래서. 지금까지 너무 좋아

[email protected]>CREATE OR REPLACE PROCEDURE hi_there 
    2 AS 
    3 BEGIN 
    4 dbms_output.put_line ('Hello World'); 
    5 END; 
    6/ 

Procedure created. 

:

나는 간단한 절차를 만듭니다.
존재합니까? 작동합니까?

[email protected]>exec hi_there 
Hello World 

PL/SQL procedure successfully completed. 

분명히 그렇습니다.

이제 user_objects가 그 존재를 알고 있습니까?

[email protected]>SELECT object_name||' - '||object_type object 
    2 FROM user_objects 
    3 WHERE object_name = 'HI_THERE'; 

OBJECT 
----------------------------------------------------------- 

HI_THERE - PROCEDURE 

1 row selected. 

예! 큰!
지금, 나

[email protected]>SELECT * 
    2 FROM user_source 
    3 WHERE name = 'HI_THERE' 
    4 ; 

no rows selected 

실례 소스 보여? 이름을 잊어 버렸나요?

[email protected]>SELECT * 
    2 FROM user_source 
    3 ; 

no rows selected 

내가


새로운 정보를 잃었어요

[email protected]>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. 

: 나는이 문제에 관한 생각하지 않습니다

dba_source 중 하나를 내 소스 중 하나를 표시하지 않습니다 하지만 어쨌든 언급해야합니다 :
Windows 노트북에서 실행 중입니다.
Windows 8.1이 정확합니다.

@Lalit
여기에 요점이있는 것 같습니다.
dbms_metadata는 모든 내 객체의 코드를 올바르게 생성합니다.

[email protected]>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에서 모든 행을 선택합니다.
보기에 문제가 있으면이보기에 있어야합니다 (또는 더 깊어 야합니다). 등의

내가 아는
(분명히 내 ERO 계정이 뷰의 이러한 종류의 직접 조회 할 수 없기 때문에)는 PDB에 SYSDBA와 같은 시스템으로 로그인 볼 수 있도록의 쿼리가, 나도 알아, 내가해야 결코 로그 이러한하지만, 데이터베이스 그래서, 예상대로이 결코

[email protected]>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 
; 


나는 이것을 얻는다. 기본적으로 사용자와 객체 그리고 소스에서 소스로 조인합니다.
그리고 개체가 어떤 종류의 있어야합니다.
아마도 내 개체의 '형식'이 잘못 되었습니까?
첫 번째 질문은 그러므로 나는 ...
지금 오브젝트가 존재하고, 만약 그렇다면, 그 OBJ 번호, 유형 및 하위 이름 무엇인가, 내 사용자 # 나는 usernumber있어

[email protected]>SELECT u.user# 
    2 FROM sys.user$ u 
    3 WHERE u.name = 'ERO' 
    4 ; 

      USER# 
--------------- 
      111 

1 row selected. 

것입니다 (where 절의 내용)?

[email protected]>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. 

예, 존재합니다.
그리고 type/subname 조합은 where 절로 제외됩니다.
그래서 문제는 sys.source $에 있어야합니다.
분명히 소스를 제공하지 않는 한 ....

[email protected]>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 문은 내 프로 시저 소스를 생성해야합니다.
그러나 그렇다면보기에서 선택해야합니다.

그래서, 내가 알고 있지만 그것은 내가보기의 소스 인 선택 문에서 선택하면 어떻게되는지 확인해 보겠습니다 (뷰가 doen't 때문에) 나에게 내 소스 코드를 줄 수

[email protected]>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. 

는 솔직히

+1

나는 비 플러그 데이터베이스, Windows에서 12.1.0.2.0 64 비트 엔터프라이즈 버전에서이 문제를 재현 할 수 있습니다. 어쨌든 12.1.0.2로 업그레이드 할 수 있습니다 - 그것은 좋은 기능과 수정을 많이 가지고 있으며, 그것은 더 이상 12.1.0.1 이상 지원됩니다. 그게 당신의 문제를 해결할 수 있는지 모르겠지만 적어도 그것을 좁힐 수 있습니다. –

+0

내 대답에 언급 된대로 대안을 시도해 볼 수 있습니까? –

+0

당신이 잘못된 장소를 가리키는 모든 *의 _source 또는 다른 동의어가 있습니까? 아니, 모든 %의 소스보기를 단 1 동의어가 : –

답변

1

지난주 나는 Tom Kyte와 대화 할 기회가 충분했습니다. 그는 AskTom의 톰이기 때문에 나는 그 일을했다. 나는이 문제에 관해 그에게 물었다. 나는 위에서 쓴 것을 설명하고 그에게 물었다 : "내가 뭘 잘못 했니?"

그의 대답은 평범하고 간단했습니다. "아마도 아무것도"아닙니다. 12.1.0.1은 갑자기 데이터를 컨테이너 데이터베이스와 플러그인 데이터베이스의 일부에서 가져와야하기 때문에 datadictionary 뷰에 몇 가지 버그가 있음을 설명했습니다. Tom은 내가 호스 버그 중 하나를 만났다고 결론을 내 렸습니다.

아직 아무도이 동작을 확인할 수 없기 때문에 12.1.0.1 데이터베이스를 사용하는 유일한 사람이라고 상상할 수 없기 때문에이 버그가 눈에 띄는 원인이되었을 것입니다.

어쨌든 문제가 제품 내에있을 것이라는 확신이 들었으므로 추가 조사를 중단하고 12.1.0.2로 업그레이드 할 것입니다. 업그레이드로 인해 문제가 사라지면 12.1.0.1 어리 석음을 반복 한 후 1 주일 후에 다시 나타나지 않을 것이라고 확신합니다.

편집 25/02 :

지난 주말은 12.1.0.1을 설치 해제 내가 12.1.0.1에 사용되는 동일한 단계에 따라 12.1.0.2를 설치했습니다. 문제가 해결되었습니다. Tom이 옳았다 (다시 한번) 것처럼 보입니다.

+0

안녕하세요, whe는 당신과 같은 문제가 있습니다. 프로 시저, 뷰 및 함수를 생성하고 실행할 수 있지만 소스를 볼 수 없습니다 (두꺼비 또는 DBeaver 사용). Oracle 12.1.0.2를 새로 설치했지만 동일한 문제가 있습니다. 12.1.0.2 설치에 특별한 것이 있습니까? 감사 – Carra

0

:-(네덜란드의 상태에서 썩은 뭔가가있다, 나는 그런 문제로 들어 본 적이없는 나는 그것을. 그래서, 내가 당신에게 이상한 행동에 대한 이유를 말할 수 없다 재현 할 수 없습니다.

그러나 실제로는을 볼 수 있습니다. 다른 PL/SQL 코드를 제외하고210 코드는 user_source보기에 문제가있을 것이라고 확신합니다. 트리거는 *_source보기에 포함되어 있지 않으므로 MOS을 검색했는데 문제와 관련하여 자금을 지원하지 못했습니다. 당신이 어떤 결과를 얻을 수 있는지 흥미로운 일이 될 것이다

 
select dbms_metadata.get_ddl('PROCEDURE','PROCEDURE_NAME','USERNAME') from dual; 

-

대안은 dbms_metadata 시도하십시오 수 있습니다, 당신의 절차에 대한 소스 코드를 얻을 수 USER_SOURCE합니다.

+0

원본 게시물에 대해 추가 조사를했습니다. 질문에 대한 답변 포함. 노력에 감사드립니다. –

관련 문제