Sql 对象关系数据库的REF查询
因此,目前我的数据库如下所示:Sql 对象关系数据库的REF查询,sql,oracle,object-relational-model,Sql,Oracle,Object Relational Model,因此,目前我的数据库如下所示: //分支表 创建类型branch_type作为对象(投标编号(6)、branch_id参考branch_type、b_street varchar2(20)、b_city varchar2(20)、b_p_代码varchar2(8)、b_电话号码(14)); 创建分支类型的表分支; 插入分支机构值(分支机构类型('901',NULL,'Market','Edinburgh','EH5 1AB','0131123560'); 插入分支值(分支类型('908',NUL
//分支表
创建类型branch_type作为对象(投标编号(6)、branch_id参考branch_type、b_street varchar2(20)、b_city varchar2(20)、b_p_代码varchar2(8)、b_电话号码(14));
创建分支类型的表分支;
插入分支机构值(分支机构类型('901',NULL,'Market','Edinburgh','EH5 1AB','0131123560');
插入分支值(分支类型('908',NULL,'Bridge','Glasgow','G18 1QQ','01413214556');
在分支机构中插入选择分支机构类型(“901”,参考(e),b_市b_街,b_p_代码,b_电话),其中e.BID='901';
在分支机构中插入选择分支机构类型(“908”,参考(e),b_市b_街,b_p_代码,b_电话),其中e.BID='908';
//员工表
创建类型员工类型作为对象(e_投标参考分支机构类型、empID编号(8)、e_街道varchar2(20)、e_城市varchar2(20)、e_p_代码varchar2(8)、e_头衔varchar2(4)、e_姓氏varchar2(20)、emp家庭电话号码(14)、emp_移动电话号码(22)、主管号码(6)、e_职位varchar2(20)、工资号码(5)、e_ninum varchar2(8),加入日期);
创建employee_类型的employee表;
将“101”、“Dart”、“爱丁堡”、“EH1 05T”、“Mrs”、“艾莉森·史密斯”、“0131225555”、“0770562344307907812345”、“空”、“Head”、“50000”、“NI001”、“2006年2月1日”插入员工选择参考(e)中
来自分支e,其中e.bid='901';
将“105”、“新”、“爱丁堡”、“EH2 4AB”、“Mr”、“John William”、“01312031990、0790231455107701234567”、“101”、“经理”、“40000”、“NI010”、“04-MAR-07”插入员工选择参考(e)中
来自分支e,其中e.bid='901';
将“108”、“Old”、“Edinburgh”、“EH9 4BB”、“Mr”、“Mark Slack”、“0131211”、“NULL”、“105”、“会计师”、“30000”、“NI120”、“09年2月1日”插入员工选择参考(e)中
来自分支机构e,其中e.bid=901;
将“804”、“Adam”、“Edinburgh”、“EH1 6EA”、“Mr”、“Jack Smith”、“0131112223”、“0781209890”、“801”、“Leader”、“35000”、“NI810”、“05-Feb-08”插入员工选择参考号(e)中
来自分支机构e,其中e.bid=908;
从员工中选择e_出价,其中e_出价='901'//我正在使用的查询
我试图在employee表中查询引用到分支表的bid,但当我运行工作表时,脚本输出告诉我没有选择行。
e\u bid
是对分支对象的引用,而不是对象中包含的bid
列。你想要:
SELECT e_bid
FROM EMPLOYEE
WHERE DEREF(e_bid).bID = 901;
我看不出您的BRANCH\u TYPE
需要包含自引用的原因(当您设置它时,您正在创建一个分支的副本,因此将有一个实例BRANCH\u id
为NULL
和另一个实例引用自身)
您在表中重复几个结构,更好的结构可能是:
DROP SEQUENCE EMPLOYEES__ID__SEQ;
DROP TABLE EMPLOYEES;
--DROP TYPE EMPLOYEE_TYPE;
--DROP TABLE BRANCHES;
--DROP TYPE BRANCH_TYPE;
--DROP TYPE PHONENUMBER_TABLE_TYPE;
--DROP TYPE PHONENUMBER_TYPE;
--DROP TYPE ADDRESS_TYPE;
CREATE TYPE ADDRESS_TYPE AS OBJECT(
street varchar2(20),
city varchar2(20),
p_code varchar2(8)
);
/
CREATE TYPE PHONENUMBER_TYPE AS OBJECT(
international varchar2(4),
area varchar2(5),
local varchar2(8)
);
/
CREATE TYPE PHONENUMBER_TABLE_TYPE AS TABLE OF PHONENUMBER_TYPE;
/
CREATE TYPE BRANCH_TYPE AS OBJECT (
ID number(6),
Address ADDRESS_TYPE,
Phone PHONENUMBER_TYPE
);
/
create table branches of branch_type( ID PRIMARY KEY );
INSERT INTO BRANCHES VALUES (
901,
ADDRESS_TYPE( 'Market', 'Edinburgh', 'EH5 1AB' ),
PHONENUMBER_TYPE( '044', '1311', '235560' )
);
INSERT INTO BRANCHES VALUES (
908,
ADDRESS_TYPE( 'Bridge', 'Glasgow', 'G18 1QQ' ),
PHONENUMBER_TYPE( '044', '1413', '214556' )
);
create type employee_Type as object(
branch ref branch_type,
ID number(8),
address ADDRESS_TYPE,
title varchar2(4),
firstname_surname varchar2(20),
homephone PHONENUMBER_TYPE,
mobiles PHONENUMBER_TABLE_TYPE,
supervisor REF EMPLOYEE_TYPE, -- Change this to a REF
position varchar2(20),
salary number(5),
ninum varchar2(8),
joindate date
);
/
create table employees of employee_Type (
ID PRIMARY KEY
) NESTED TABLE mobiles STORE AS employees_mobiles;
CREATE SEQUENCE employees__id__seq;
insert into employees
select ref(b),
101, -- EMPLOYEES__ID__SEQ.NEXTVAL,
ADDRESS_TYPE( 'Dart', 'Edinburgh', 'EH1 05T' ),
'Mrs',
'Alison Smith',
PHONENUMBER_TYPE( '044', '1312', '125555' ),
PHONENUMBER_TABLE_TYPE(
PHONENUMBER_TYPE( '044', '7705', '623443' ),
PHONENUMBER_TYPE( '044', '7907', '812345' )
),
NULL,
'Head',
50000,
'NI001',
DATE '1906-02-01'
from branches b
where b.id = 901;
insert into employees
select ref(b),
102, -- EMPLOYEES__ID__SEQ.NEXTVAL,
ADDRESS_TYPE('New', 'Edinburgh', 'EH2 4AB'),
'Mr',
'John William',
PHONENUMBER_TYPE(NULL, '0131', '2031990'),
PHONENUMBER_TABLE_TYPE (PHONENUMBER_TYPE('44', '07902', '314551'), PHONENUMBER_TYPE('44', '07701', '234567')),
REF(s),
'Manager',
40000,
'NI010',
DATE '2007-03-04'
from branches b,
employees s
where b.id = 901
and s.id = 101;
e_bid
是对分支对象的引用,而不是对对象中包含的bid
列的引用。你想要:
SELECT e_bid
FROM EMPLOYEE
WHERE DEREF(e_bid).bID = 901;
我看不出您的BRANCH\u TYPE
需要包含自引用的原因(当您设置它时,您正在创建一个分支的副本,因此将有一个实例BRANCH\u id
为NULL
和另一个实例引用自身)
您在表中重复几个结构,更好的结构可能是:
DROP SEQUENCE EMPLOYEES__ID__SEQ;
DROP TABLE EMPLOYEES;
--DROP TYPE EMPLOYEE_TYPE;
--DROP TABLE BRANCHES;
--DROP TYPE BRANCH_TYPE;
--DROP TYPE PHONENUMBER_TABLE_TYPE;
--DROP TYPE PHONENUMBER_TYPE;
--DROP TYPE ADDRESS_TYPE;
CREATE TYPE ADDRESS_TYPE AS OBJECT(
street varchar2(20),
city varchar2(20),
p_code varchar2(8)
);
/
CREATE TYPE PHONENUMBER_TYPE AS OBJECT(
international varchar2(4),
area varchar2(5),
local varchar2(8)
);
/
CREATE TYPE PHONENUMBER_TABLE_TYPE AS TABLE OF PHONENUMBER_TYPE;
/
CREATE TYPE BRANCH_TYPE AS OBJECT (
ID number(6),
Address ADDRESS_TYPE,
Phone PHONENUMBER_TYPE
);
/
create table branches of branch_type( ID PRIMARY KEY );
INSERT INTO BRANCHES VALUES (
901,
ADDRESS_TYPE( 'Market', 'Edinburgh', 'EH5 1AB' ),
PHONENUMBER_TYPE( '044', '1311', '235560' )
);
INSERT INTO BRANCHES VALUES (
908,
ADDRESS_TYPE( 'Bridge', 'Glasgow', 'G18 1QQ' ),
PHONENUMBER_TYPE( '044', '1413', '214556' )
);
create type employee_Type as object(
branch ref branch_type,
ID number(8),
address ADDRESS_TYPE,
title varchar2(4),
firstname_surname varchar2(20),
homephone PHONENUMBER_TYPE,
mobiles PHONENUMBER_TABLE_TYPE,
supervisor REF EMPLOYEE_TYPE, -- Change this to a REF
position varchar2(20),
salary number(5),
ninum varchar2(8),
joindate date
);
/
create table employees of employee_Type (
ID PRIMARY KEY
) NESTED TABLE mobiles STORE AS employees_mobiles;
CREATE SEQUENCE employees__id__seq;
insert into employees
select ref(b),
101, -- EMPLOYEES__ID__SEQ.NEXTVAL,
ADDRESS_TYPE( 'Dart', 'Edinburgh', 'EH1 05T' ),
'Mrs',
'Alison Smith',
PHONENUMBER_TYPE( '044', '1312', '125555' ),
PHONENUMBER_TABLE_TYPE(
PHONENUMBER_TYPE( '044', '7705', '623443' ),
PHONENUMBER_TYPE( '044', '7907', '812345' )
),
NULL,
'Head',
50000,
'NI001',
DATE '1906-02-01'
from branches b
where b.id = 901;
insert into employees
select ref(b),
102, -- EMPLOYEES__ID__SEQ.NEXTVAL,
ADDRESS_TYPE('New', 'Edinburgh', 'EH2 4AB'),
'Mr',
'John William',
PHONENUMBER_TYPE(NULL, '0131', '2031990'),
PHONENUMBER_TABLE_TYPE (PHONENUMBER_TYPE('44', '07902', '314551'), PHONENUMBER_TYPE('44', '07701', '234567')),
REF(s),
'Manager',
40000,
'NI010',
DATE '2007-03-04'
from branches b,
employees s
where b.id = 901
and s.id = 101;
ORA-02315:第一条insert语句中默认构造函数的参数数目不正确。如果您在第三条insert语句中修复了不匹配的括号,则会得到ORA-00904:“E”。“BID”:无效标识符
。。。请修复脚本,使其实际执行。我为数据库添加了新代码。ORA-02315:第一条insert语句中默认构造函数的参数数目不正确。如果修复第三条insert语句中不匹配的括号,则会得到ORA-00904:“E”。.BID:无效标识符
。。。请修复您的脚本,使其实际执行。我为数据库添加了新代码。这是一种更有效的方法,谢谢您的帮助!我试图使用此语句将数据插入到员工中-插入到员工中选择ref(b),ref(s),105,地址类型('New','Edinburgh','EH2 4AB'),'Mr','John William','PHONENUMBER_类型(NULL,'0131','2031990'),PHONENUMBER_表_类型(PHONENUMBER_类型('44','07902','314551'),PHONENUMBER_类型('44','07701','234567')),ref,“经理”,40000,“NI010”,“07年3月4日”,来自分支机构b,员工s,其中b.id=901,s.SUPERVISOR=101//但事实并非如此working@Scott已更新-您有一个太多的列,您希望在末尾添加s.id=101
。我还添加了一个序列,您可以使用它生成ID值。先生,您是一个救生员!假设我想查询嵌套表,我会使用客户c表(c.MOBILES)t中的selectc.firstname\u姓氏,t.*
要查看嵌套表中的所有数字,我如何搜索从0770开始的数字?甚至有超过一个数字的人@这是一种更有效的方法,谢谢你的帮助!我试图使用此语句将数据插入到员工中-插入到员工中选择ref(b),ref(s),105,地址类型('New','Edinburgh','EH2 4AB'),'Mr','John William','PHONENUMBER_类型(NULL,'0131','2031990'),PHONENUMBER_表_类型(PHONENUMBER_类型('44','07902','314551'),PHONENUMBER_类型('44','07701','234567')),ref,“经理”,40000,“NI010”,“07年3月4日”,来自分支机构b,员工s,其中b.id=901,s.SUPERVISOR=101//但事实并非如此working@Scott已更新-您有一个太多的列,您希望在末尾添加s.id=101
。我还添加了一个序列,您可以使用它生成ID值。先生,您是一个救生员!假设我想查询嵌套表,我会使用客户c表(c.MOBILES)t中的selectc.firstname\u姓氏,t.*
要查看嵌套表中的所有数字,我如何搜索从0770开始的数字?甚至有超过一个数字的人@MT0