2012-12-03 6 views
1

기본적으로 레코드에 대한 참조를 만들고 싶습니다. 한 레코드 유형은 다른 레코드의 수퍼 유형입니다. 나는 약간 혼란 스럽다. 여기 PL/SQL에서 참조 만들기

내 유형이 있습니다

insert into module_tab values(
'm001', 'physics' 
); 

I :

CREATE TABLE module_tab OF module_t(
    moduleCode# PRIMARY KEY NOT NULL 
); 

CREATE TABLE course_tab OF course_t(
    courseCode# PRIMARY KEY NOT NULL, 
    scope for (module1) is module_tab, 
    scope for (module2) is module_tab 
); 

나는 표준 모듈로 구성된 모듈 테이블에 레코드를 삽입 : 여기

CREATE OR REPLACE TYPE module_t AS OBJECT (
    moduleCode# char(4), 
    moduleName char(10) 
) NOT FINAL; 
/

CREATE OR REPLACE TYPE specialised_module_t under module_t (
    someSpecialAttribute char(10) 
); 
/

CREATE OR REPLACE TYPE course_t AS OBJECT (
    courseCode# char(4), 
    module1 REF module_t, 
    module2 REF specialised_module_t 
); 
/

내 테이블입니다 특수 모듈로 구성된 모듈 테이블에 레코드를 삽입하십시오 :

나는 물론 테이블에서 코스 레코드를 생성 할 :

insert into module_tab 
    values(specialised_module_t(
    'm002', 
    'physics', 
    'special' 
    ) 
); 

여기에 까다로운 비트입니다. 이 기록에서 module1 속성은 모듈 m001 (첫 번째 모듈 기록)를 참조해야하고 module2 속성은 모듈에게 내가 이런 식으로 뭔가 보일 것 어쩌면 생각 m002

참조 할 필요가있다 :

INSERT into course_tab VALUES(
     'c001', 
     SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm001', 
     SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm002' 
) 

이를 그냥 작동하지 않습니다 :(여기

오류 메시지입니다 :

ERROR at line 3: 
ORA-00936: missing expression 
,846,510,403,210은 분명히 내 구문은 잘못된 것입니다,하지만 난 그것을 해결하는 방법을 모른다 : 나는이에 나이를 지출하고 난 그것을 알아낼 수 없습니다/

:(
도움이 많이 주시면 감사합니다 : D
감사합니다

UPDATE :

INSERT into course_tab VALUES(
     'c001', 
     (SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm001'), 
     (SELECT treat(REF(c) as ref specialised_module_t) FROM module_tab c WHERE treat(values(c) as moduleCode).person# = 'm002') 
); 

하지만 지금은 오류 :

@a_horse_with_no_name의 도움으로 나의 새로운 코드가

ERROR at line 4: 
ORA-00936: missing expression 

도와주세요, 감사합니다 :)

+1

"*이 동작하지 않습니다 *"유효한 Oracle 오류 메시지가 아닙니다. –

+0

@a_horse_with_no_name 죄송합니다. 내 잘못입니다. 오류 메시지를 추가했습니다. 당신이 한 번 봐 주시면 정말 고맙겠습니다. 감사합니다 – dewijones92

답변

0

당신이 VALUES 절 내부의 스칼라 값을 삽입 할 SELECT 문을 사용하려면, 당신은 괄호 betweeen SELECT 문에 둘 필요가 :

INSERT into course_tab 
    (coursecode#, module1, module2) 
VALUES 
    (
    'c001', 
    (SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm001'), 
    (SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm002') 
    ); 

비록 당신의 예제 (다른 구문 오류가 많이 남아있는)를 사용해 보았지만 오류 메시지가 나타났습니다.

ORA-00932: inconsistent datatypes: expected REF SPECIALISED_MODULE_T got REF MODULE_T [SQL State=42000, DB Errorcode=932]

나는 그걸로 무엇을해야할지 모르겠다. (나는 오라클 객체 유형을 다루지 않았고 course_tab에 대한 테이블 정의는 완전히 새로운 것이다.

+0

도움을 주셔서 감사합니다. 내 질문을 업데이트했습니다. 당신이 볼 수 있다면, 좋을 것입니다, 고마워요. – dewijones92

관련 문제