Sql Oracle对象关系数据库将记录插入到引用派生表的表中
我有下面的结构,我想在项目表中添加一条记录。以下插入的问题是,在“客户”位置,我必须在插入时从“用户”表中选择一条记录,但我只想选择“客户”,不想选择“员工”。基本上,customer和staff继承自user表:user 您可以查看相同的insert,但对于service\t,它可以正常工作,因为我是从一个表中选择的,但在本例中,没有针对客户的表 我对这个ORM没什么经验。你知道怎么解决吗Sql Oracle对象关系数据库将记录插入到引用派生表的表中,sql,oracle,Sql,Oracle,我有下面的结构,我想在项目表中添加一条记录。以下插入的问题是,在“客户”位置,我必须在插入时从“用户”表中选择一条记录,但我只想选择“客户”,不想选择“员工”。基本上,customer和staff继承自user表:user 您可以查看相同的insert,但对于service\t,它可以正常工作,因为我是从一个表中选择的,但在本例中,没有针对客户的表 我对这个ORM没什么经验。你知道怎么解决吗 INSERT INTO project VALUES ( 1, 'Project name',
INSERT INTO project VALUES (
1,
'Project name',
'Description',
( SELECT REF(u) AS customer_t
FROM "USER" u
WHERE idno = 1
AND VALUE(u) IS OF TYPE (customer_t)
),
( SELECT REF(s) FROM service s WHERE serviceno = 1)
);
错误消息:
Error starting at line : 1 in command -
INSERT INTO project VALUES (1, 'Project name', 'Logo', (SELECT REF(u) AS customer_t FROM "USER" u WHERE idno = 1 AND VALUE(u) IS OF TYPE (customer_t)), (SELECT REF(s) FROM service s WHERE serviceno = 1))
Error at Command Line : 1 Column : 72
Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected REF C##EX_TEST.CUSTOMER_T got REF C##EX_TEST.USER_T
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
SQL:
创建类型名称\u t作为对象
名为VARCHAR232,
姓VARCHAR232
;
创建类型地址作为对象
瓦查尔省,
瓦查尔街232号,
瓦查尔市,
邮政编码VARCHAR210
;
创建类型用户作为对象
idno号码,
电邮:VARCHAR240,
密码VARCHAR232,
姓名,
地址,
电话:VARCHAR215,
映射成员函数get_idno返回编号
不是最终的;
创建类型rank\t作为对象
兰克诺数,
名字是VARCHAR240,
说明VARCHAR260
;
创建秩的表秩\u t
主键rankno,
唯一名称
;
在排名值1中插入“用户”、“简单用户”;
在排名值中插入“经理”、“经理”;
在等级值3中插入“管理员”、“管理员”;
在用户下创建类型customer\u t
;
在用户下创建类型staff\u t
工资编号7,2,
秩参考秩t
;
创建用户的表用户\u t
主键idno,
独特的电子邮件;
创建类型服务作为对象
服务没有号码,
名字是VARCHAR240,
说明VARCHAR260
;
创建服务主键serviceno的表服务;
创建类型项目作为对象
项目编号:,
名字是VARCHAR240,
说明VARCHAR260,
客户参考客户,
服务参考服务
;
创建project\u t主键projectno的表project;
您不需要为客户提供单独的桌子;只需将类型插入用户表 如果要将客户放入,请插入客户类型: 插入到用户值中 顾客 1. 'person1@customer.example.com', “abcdefg”, 名字_t'One','Uno', 地址“省”、“街”、“市”、“12345”, '0123456789' ; 如果要插入用户,请使用user\t或插入不带类型的值: 插入到用户值中 2. 'person2@user.example.com', “abcdefg”, 命名“两个”、“Dos”, 地址“省”、“街”、“市”、“12345”, '0123456789' ; 如果要插入职员,请使用staff\t: 插入到用户值中 职员 3. 'person3@staff.example.com', “abcdefg”, 命名“三”,“三”, 地址“省”、“街”、“市”、“12345”, '0123456789', 12345.67, 从秩r中选择REFr,其中rankno=2 ; 然后,数据将具有正确的类型,您可以使用TREAT函数将超级类型转换为子类型: 选择idno, 电子邮件 SYS.ANYDATA.getTypeName SYS.ANYDATA.convertObject VALUEu作为类型, 将价值视为员工工资, 将ValueU视为职员\u t.rank.name视为职级 来自用户u 产出: 产出: dbfiddle您创建了类型customer\t,但没有该类型的表。表project.customer中没有可引用的内容。@当然,用户对象表存储用户类型,而customer和staff是该对象的子类型,可以存储在同一个表中。 IDNO | EMAIL | TYPE | SALARY | RANK ---: | :--------------------------- | :------------------------------------- | -------: | :------ 1 | person1@customer.example.com | FIDDLE_KPHUNVHPVRKOYQBWVAQS.CUSTOMER_T | null | null 2 | person2@user.example.com | FIDDLE_KPHUNVHPVRKOYQBWVAQS.USER_T | null | null 3 | person3@staff.example.com | FIDDLE_KPHUNVHPVRKOYQBWVAQS.STAFF_T | 12345.67 | Manager IDNO | EMAIL ---: | :--------------------------- 1 | person1@customer.example.com