【问题标题】:REF querying with object-relational database使用对象关系数据库进行 REF 查询
【发布时间】:2016-07-04 12:58:41
【问题描述】:

所以目前我的数据库如下:

//branch table
create type branch_Type as object(bID number(6), branch_id ref branch_Type, b_street varchar2(20), b_city varchar2(20), b_p_code varchar2(8), b_bPhone number(14));

create table branch of branch_Type;

INSERT INTO branch VALUES(branch_Type('901', NULL, 'Market', 'Edinburgh', 'EH5 1AB', '01311235560'));

INSERT INTO branch VALUES(branch_Type('908', NULL, 'Bridge', 'Glasgow', 'G18 1QQ', '01413214556'));

insert into branch SELECT branch_Type('901', ref(e), b_street, b_city, b_p_code, b_bPhone) from branch e where e.BID = '901';

insert into branch SELECT branch_Type('908', ref(e), b_street, b_city, b_p_code, b_bPhone) from branch e where e.BID = '908';

//employee table
create type employee_Type as object(e_bid ref branch_Type, empID number(8), e_street varchar2(20), e_city varchar2(20), e_p_code varchar2(8), e_title varchar2(4), e_firstname_surname varchar2(20), emphomephone number(14), emp_mobile_1_2 number(22), supervisorID number(6), e_position varchar2(20), salary number(5), e_ninum varchar2(8), joindate date);

create table employee of employee_Type;

insert into employee select ref(e), '101', 'Dart', 'Edinburgh', 'EH1 05T', 'Mrs', 'Alison Smith', '01312125555', '0770562344307907812345', NULL, 'Head', '50000', 'NI001', '01-FEB-06'
from branch e where e.bid = '901';

insert into employee select ref(e), '105', 'New', 'Edinburgh', 'EH2 4AB', 'Mr', 'John William', 01312031990, 0790231455107701234567, '101', 'Manager', '40000', 'NI010', '04-MAR-07'
from branch e where e.bid = '901';

insert into employee select ref(e), '108', 'Old', 'Edinburgh', 'EH9 4BB', 'Mr', 'Mark Slack', 01312102211, NULL, '105', 'accountant', '30000', 'NI120', '01-Feb-09'
from branch e where e.bid = 901;

insert into employee select ref(e), '804', 'Adam', 'Edinburgh', 'EH1 6EA', 'Mr', 'Jack Smith', 01311112223, 0781209890, '801', 'Leader', '35000', 'NI810', '05-Feb-08'
from branch e where e.bid = 908;

select e_bid from EMPLOYEE where e_bid = '901'; //query I'm using

我正在尝试在员工表中查询引用到分支表的投标,但是当我运行工作表时,脚本输出告诉我没有选择任何行。

【问题讨论】:

  • ORA-02315: incorrect number of arguments for default constructor 在第一个插入语句中。
  • 如果你修复了第三个插入语句中不匹配的括号,你会得到ORA-00904: "E"."BID": invalid identifier ...请修复你的脚本以便它实际执行。
  • 我已经为数据库添加了新代码。

标签: sql oracle object-relational-model


【解决方案1】:

e_bid 是对分支对象的引用,并不引用对象中包含的bID 列。你想要:

SELECT e_bid
FROM   EMPLOYEE
WHERE  DEREF(e_bid).bID = 901;

我看不出为什么您的 BRANCH_TYPE 需要包含自引用(并且当您设置它时,您正在创建分支的副本,因此将有一个实例 branch_idNULL 和另一个实例指自己)。

您在表格中重复了几个结构,更好的结构可能是:

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;

【讨论】:

  • 这个,是目前为止更高效的方法,谢谢你的帮助!
  • 我正在尝试使用此语句将数据插入员工中 - 插入员工中 select ref(b),ref(s), 105, ADDRESS_TYPE('New', 'Edinburgh', 'EH2 4AB '), '先生', '约翰威廉', PHONENUMBER_TYPE(NULL, '0131', '2031990') ,PHONENUMBER_TABLE_TYPE (PHONENUMBER_TYPE('44', '07902', '314551'), PHONENUMBER_TYPE('44', '07701 ', '234567')), ref(s), 'Manager', 40000, 'NI010', '04-MAR-07' 来自分支机构 b,员工 s,其中 b.id = 901 和 s.SUPERVISOR = 101; //但它不起作用
  • @Scott 更新了 - 你的列太多了,最后你想要s.id = 101。我还添加了一个序列,您可以使用它来生成 ID 值。
  • 你先生,是救命稻草!
  • 假设我想查询嵌套表,我会使用 select c.firstname_surname, t.* from CUSTOMER c, table(c.MOBILES) t; 来查看嵌套表中的所有数字,我将如何搜索以 0770 开头的数字?甚至有超过 1 个号码的人? @MT0
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2010-09-07
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多