2012-12-03 12 views
1

基本上,我想創建對記錄的引用,一個記錄類型是另一個的超類型。我對此感到困惑。在PL/SQL中創建引用

這裏是我的類型:

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 
); 
/

這裏是我的表:

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 
); 

我插入記錄由標準模塊的模塊表:

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

我將記錄插入到由專門模塊組成的模塊表中:

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 

顯然,我的語法是錯誤的,但我不知道如何糾正它:/

我已經在這個花了年齡,我無法弄清楚:(
幫助將非常感激:d
由於

UPDATE:

與@a_horse_with_no_name幫助我的新代碼:

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') 
); 

但現在我得到的錯誤:

ERROR at line 4: 
ORA-00936: missing expression 

請幫忙,謝謝:)

+1

「*這只是不起作用*」不是有效的Oracle錯誤消息。 –

+0

@a_horse_with_no_name對不起,我的壞。我現在添加了錯誤消息。如果你看一看,我會很感激。謝謝 – dewijones92

回答

0

如果你想使用SELECT語句來插入VALUES子句中的標值,你需要把SELECT語句betweeen括號:

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]

我真的不知道該怎麼做(正如我所說的,我沒有真正與Oracle對象類型合作過,並且course_tab的表定義對我來說是全新的。

+0

感謝您的幫助。 我已更新我的問題。如果你能看一看,那會很棒,謝謝 – dewijones92