插入到具有子类型列的表中:类型继承,面向对象SQL
当我尝试将数据插入下表时插入到具有子类型列的表中:类型继承,面向对象SQL,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,当我尝试将数据插入下表时 create table Policies of policy_t( pid primary key, inscar references Cars )nested table claims store as claims_ntable; 使用以下查询 insert into policies select policy_t ('PLC1234','12 Mar 2017','12 Mar 2018',REF(C),175000,claim_t('C
create table Policies of policy_t(
pid primary key,
inscar references Cars
)nested table claims store as claims_ntable;
使用以下查询
insert into policies
select policy_t ('PLC1234','12 Mar 2017','12 Mar 2018',REF(C),175000,claim_t('CLAIM1234567','12 Feb 2017','56000',REF(T)))
from cars C,customer T
where C.regno = 'CAB3233' and T.cid = '123ABC'
我得到以下错误
Error starting at line : 1 in command -
insert into policies
select policy_t ('PLC1234','12 Mar 2017','12 Mar 2018',REF(C),175000,claim_t('CLAIM1234567','12 Feb 2017','56000',REF(T)))
from cars C,customer T
where C.regno = 'CAB3233' and T.cid = '123ABC'
Error at Command Line : 3 Column : 25
Error report -
SQL Error: ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
如何将数据插入此表
其他相关对象类型和表
客户对象类型
create type Customer_t as object(
cid char(6),
cusname varchar(15),
birthdate date,
phone char(10),
address varchar(50)
);
create type claim_t as object(
claimno char(12),
cdate date,
amount number(8,2),
claimant ref customer_t
);
create type Car_t as object(
regno char(9),
make varchar(12),
model varchar(10),
mdate date,
owner ref customer_t,
value number(8,2)
);
create type policy_t as object(
pid char(7),
sdate date,
edate date,
inscar ref car_t,
premium number(6,2),
claims claim_ntab
)
客户表
create table Customers of customer_t(
cid primary key
);
索赔对象类型
create type Customer_t as object(
cid char(6),
cusname varchar(15),
birthdate date,
phone char(10),
address varchar(50)
);
create type claim_t as object(
claimno char(12),
cdate date,
amount number(8,2),
claimant ref customer_t
);
create type Car_t as object(
regno char(9),
make varchar(12),
model varchar(10),
mdate date,
owner ref customer_t,
value number(8,2)
);
create type policy_t as object(
pid char(7),
sdate date,
edate date,
inscar ref car_t,
premium number(6,2),
claims claim_ntab
)
索赔嵌套表
create type Claim_ntab is table of claim_t;
汽车对象类型
create type Customer_t as object(
cid char(6),
cusname varchar(15),
birthdate date,
phone char(10),
address varchar(50)
);
create type claim_t as object(
claimno char(12),
cdate date,
amount number(8,2),
claimant ref customer_t
);
create type Car_t as object(
regno char(9),
make varchar(12),
model varchar(10),
mdate date,
owner ref customer_t,
value number(8,2)
);
create type policy_t as object(
pid char(7),
sdate date,
edate date,
inscar ref car_t,
premium number(6,2),
claims claim_ntab
)
车桌
create table Cars of car_t(
regno primary key,
owner references Customers
);
策略对象类型
create type Customer_t as object(
cid char(6),
cusname varchar(15),
birthdate date,
phone char(10),
address varchar(50)
);
create type claim_t as object(
claimno char(12),
cdate date,
amount number(8,2),
claimant ref customer_t
);
create type Car_t as object(
regno char(9),
make varchar(12),
model varchar(10),
mdate date,
owner ref customer_t,
value number(8,2)
);
create type policy_t as object(
pid char(7),
sdate date,
edate date,
inscar ref car_t,
premium number(6,2),
claims claim_ntab
)
策略表
create table Policies of policy_t(
pid primary key,
inscar references Cars
)nested table claims store as claims_ntable;
您将表格命名为客户,请注意复数形式 所以改变
from cars C,customer T
到
或者更好的方法是,在编写时,使用显式的
JOIN
语法重写它。插入到\u table1中(\u field1\u,\u field2\u,\u field3\u)
字段名称,而不是值
从表2中选择字段1、字段2、字段3,其中代码>
插入到表1中(字段1、字段2、字段3)
值(“一些文本”、“一些文本”、“一些文本”)
如果您想在更正表名(customer
/customers
)后添加一些值,下一个问题是customers。claims
是一个claim\u ntab
,但您正试图在其中插入一个claim\u t
。试试这个:
insert into policies
select policy_t
( 'PLC1234'
, date '2017-03-12'
, date '2018-03-12'
, ref(ca)
, 175000
, claim_ntab(claim_t
( 'CLAIM1234567'
, date '2017-02-12'
, '56000'
, ref(cu) ) )
)
from cars ca
join customers cu
on ref(cu) = ca.owner
where ca.regno = 'CAB3233'
and cu.cid = '123ABC'
编辑:我使用对象引用将您的where
子句join更改为ANSI样式。老实说,我以前没有使用过这种语法,我怀疑很少有人使用过,所以它需要一些测试。嘿,Sticky bit,感谢您宝贵的回复。如何使用REF-type而不是连接表来执行相同的操作?如何定义Cars
?对于字符串,最好使用标准的varchar2
类型,因为char
只会浪费空间并产生错误。此外,日期文字应写成日期“12017-03-12”
,而不是日期“2017年3月12日”
。您可能会侥幸逃脱,但这是自找麻烦。CAR对象类型创建类型CAR_t as OBJECT(regno char(9),make varchar(12),model varchar(10),mdate date,owner ref customer_t,value number(8,2));CAR TABLE创建CAR\u t的Cars表(regno主键,所有者引用客户);请在您的问题中包含所有必要的代码。如回答中所述,insert
语句指的是customer
,我认为应该是customers
。然后,当您尝试将claim\u t
插入claim\u ntab
列时,就会出现真正的错误。对于给您带来的不便,我已将所有必要的代码添加到一个问题中。我通过将customer\u t更改为customers\u t再次尝试查询。但是我还是遇到了同样的错误hey William,非常感谢。我已经编辑了我的答案以使用object ref join,它运行时没有错误,但如果没有测试数据和预期结果,我不知道它是否正确。hey William,我使用了你的代码。它是使用“插入0行”消息编译的。