database - 无法在 Oracle 11g 上将对象类型插入表中
问题描述
CREATE OR REPLACE TYPE CURSOR AS OBJECT(
code varchar2(20),
className varchar2(30),
teach1 Teacher,
maximumPupils number,
maximumHours number,
CONSTRUCTOR FUNCTION cursor(code varchar2, className varchar2, passport Teacher, maximumPupils number, maximumHours number) RETURN SELF AS RESULT
)NOT FINAL;
CREATE OR REPLACE TYPE BODY CURSOR
AS
CONSTRUCTOR FUNCTION cursor(code varchar2, className varchar2, passport Teacher, maximumPupils number, maximumHours number) RETURN SELF AS RESULT
IS
BEGIN
SELF.code := code;
SELF.className := className;
SELF.passport:=passport;
SELF.maximumPupils := maximumPupils;
SELF.maximumHours := maximumHours;
END;
------------------------
CREATE TABLE SubjectClass OF Cursor;
-----------------------------------------
BEGIN
insert into SubjectClass values(1,'Class 1','43345678F',30,55);
END;
我已经尝试了以下所有方法(包括使用完整的构造函数引用),仅使用我愿意插入或引用存在的另一个表的教师对象的属性 .passport(此护照号以前存在于另一个表中)称为教师的对象类型表):
插入 SubjectClass VALUES('1','Class 1', Teacher.passport('12345678A'),20,25);
插入 SubjectClass 值(1,'Class 1','43345678F',30,55);
请帮忙,我马上要考试了。
解决方案
假设您有以下类型:
create or replace type teacher as object (
passport varchar2( 32 )
, something varchar2( 64 )
, another varchar2( 64 )
)
/
create or replace type cursor_ as object (
code varchar2(20)
, className varchar2(30)
, teacher_ teacher
, maximumPupils number
, maximumHours number
, constructor function cursor_ (
code varchar2
, className varchar2
, teacher_ teacher
, maximumPupils number
, maximumHours number
) return self as result
) not final
/
cursor_ 的 TYPE BODY 的代码可能类似于 ...
create or replace type body cursor_
as
constructor function cursor_ (
code varchar2
, className varchar2
, teacher_ teacher
, maximumPupils number
, maximumHours number
) return self as result
as
begin
self.code := code ;
self.className := className ;
self.teacher_ := teacher_ ;
self.maximumPupils := maximumPupils ;
self.maximumHours := maximumHours ;
return ;
end;
end;
/
请注意,TYPE BODY 有 2 个“end;” 线。由于缺少一个“结束”这一事实,您的原始类型正文代码编译时出错。
现在您可以为 cursor_ 对象创建一个表,并插入一些测试数据:
create table subjectclass of cursor_ ;
begin
insert into subjectclass values (
new cursor_ ( 1, 'class1', new teacher( 'AA1100BB', 'something1', 'another1' ), 100, 16 )
);
insert into subjectclass values (
new cursor_ ( 2, 'class2', new teacher( 'BB2211CC', 'something2', 'another2' ), 120, 25 )
);
end ;
/
subjectclass 表的示例查询:
select
S.code
, S.classname
, S.teacher_.passport as T_PP
, S.teacher_.something as T_ST
, S.teacher_.another as T_AO
, S.maximumpupils as max_p
, S.maximumhours as max_h
from subjectclass S ;
-- result
CODE CLASSNAME T_PP T_ST T_AO MAX_P MAX_H
1 class1 AA1100BB something1 another1 100 16
2 class2 BB2211CC something2 another2 120 25
请参阅此处的dbfiddle 。
推荐阅读
- tensorflow - CNN自动编码器的输出图像是白色的
- sql - 并行执行不能加速 Exadata 中的全表扫描
- javascript - npm run test - 生命周期中的不安全烫发
- google-apps-script - 在谷歌应用程序脚本中使用 doGet(e) 的问题
- sql - SAP SQL IF 语句
- spring-integration - Spring Integration:Http请求->响应->处理->如果有更多数据可用->循环并重复,直到没有收到数据
- tomcat9 - tomcat 9 第二个实例记录到默认 catalina.out 位置
- docker - Docker 映像无法正确下载每个文件
- android - android项目中两个库的重复类
- arrays - 如何在查询之前在 ReactJS 中隐藏列表