Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 对象关系数据库的REF查询_Sql_Oracle_Object Relational Model - Fatal编程技术网

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中的select
c.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中的select
c.firstname\u姓氏,t.*
要查看嵌套表中的所有数字,我如何搜索从0770开始的数字?甚至有超过一个数字的人@MT0