1

基本上,我想创建对记录的引用,一种记录类型是另一种的超类型。我对此有点困惑。

这是我的类型:

 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
谢谢

更新:

在@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

请帮忙,谢谢:)

4

1 回答 1

0

如果要使用 SELECT 语句在 VALUES 子句中插入标量值,则需要将 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: 不一致的数据类型: 预期 REF SPECIALISED_MODULE_T 得到 REF MODULE_T [SQL 状态 = 42000,数据库错误代码 = 932]

不过,我真的不知道该怎么做(正如我所说,我还没有真正使用过 Oracle 对象类型,并且表定义对course_tab我来说是全新的。

于 2012-12-04T08:40:27.030 回答