Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle对象关系数据库将记录插入到引用派生表的表中_Sql_Oracle - Fatal编程技术网

Sql Oracle对象关系数据库将记录插入到引用派生表的表中

Sql Oracle对象关系数据库将记录插入到引用派生表的表中,sql,oracle,Sql,Oracle,我有下面的结构,我想在项目表中添加一条记录。以下插入的问题是,在“客户”位置,我必须在插入时从“用户”表中选择一条记录,但我只想选择“客户”,不想选择“员工”。基本上,customer和staff继承自user表:user 您可以查看相同的insert,但对于service\t,它可以正常工作,因为我是从一个表中选择的,但在本例中,没有针对客户的表 我对这个ORM没什么经验。你知道怎么解决吗 INSERT INTO project VALUES ( 1, 'Project name',

我有下面的结构,我想在项目表中添加一条记录。以下插入的问题是,在“客户”位置,我必须在插入时从“用户”表中选择一条记录,但我只想选择“客户”,不想选择“员工”。基本上,customer和staff继承自user表:user

您可以查看相同的insert,但对于service\t,它可以正常工作,因为我是从一个表中选择的,但在本例中,没有针对客户的表

我对这个ORM没什么经验。你知道怎么解决吗

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