[英]Create references in 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
谢谢
更新:
在@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
请帮助,谢谢:)
如果要使用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,DB错误代码= 932]
我真的不知道该怎么做(正如我说的那样,我还没有真正使用Oracle对象类型, course_tab
的表定义对我来说是全新的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.