누구나 내 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.
는 솔직히
나는 비 플러그 데이터베이스, Windows에서 12.1.0.2.0 64 비트 엔터프라이즈 버전에서이 문제를 재현 할 수 있습니다. 어쨌든 12.1.0.2로 업그레이드 할 수 있습니다 - 그것은 좋은 기능과 수정을 많이 가지고 있으며, 그것은 더 이상 12.1.0.1 이상 지원됩니다. 그게 당신의 문제를 해결할 수 있는지 모르겠지만 적어도 그것을 좁힐 수 있습니다. –
내 대답에 언급 된대로 대안을 시도해 볼 수 있습니까? –
당신이 잘못된 장소를 가리키는 모든 *의 _source 또는 다른 동의어가 있습니까? 아니, 모든 %의 소스보기를 단 1 동의어가 : –