如何将数据插入到具有refs的对象表中?

时间:2010-10-28 05:57:55

标签: sql database oracle object

我是Oracle的新手,我真的不清楚如何做到这一点。

数据库就是这个......

CREATE OR REPLACE TYPE personUdt4 AS OBJECT(
 pid varchar(11),
 firstName varchar(20),
 lastName varchar(20),
 dob date)
NOT FINAL;
/

CREATE OR REPLACE TYPE locationUdt4 AS OBJECT( 
 street varchar(30),
 bldg varchar(5),
 room varchar(5)) 
 NOT FINAL;
/

CREATE TYPE departmentUdt4;
/
CREATE TYPE studentUdt4;
/
CREATE TYPE facultyUdt4;
/

CREATE OR REPLACE TYPE campusClubUdt4 AS OBJECT( 
 cId number,
 name varchar(50),
 location locationUdt4,
 phone varchar(12),
 advisor REF facultyUdt4,
 members REF studentUdt4)
 NOT FINAL;
/

CREATE OR REPLACE TYPE facultyUdt4 UNDER personUdt4(
 rank varchar(10),
 advisorOf REF campusClubUdt4,
 worksIn REF departmentUdt4,
 chairOf REF departmentUdt4)
NOT FINAL;
/

CREATE OR REPLACE TYPE studentUdt4 UNDER personUdt4( 
      status varchar(10),
      memberOf REF campusClubUdt4,
      major REF departmentUdt4)
NOT FINAL;
/
CREATE OR REPLACE TYPE studentUdtList4 AS VARRAY(1000) of studentUdt4;
/

CREATE OR REPLACE TYPE facultyUdtList4 AS VARRAY(50) of facultyUdt4;
/

CREATE OR REPLACE TYPE departmentUdt4 AS OBJECT( 
 code varchar(3),
 name varchar(40),
 deptChair REF facultyUdt4,
        MEMBER FUNCTION getStudents RETURN studentUdtList4,
 MEMBER FUNCTION getFaculty RETURN facultyUdtList4)
 NOT FINAL;
/
CREATE TYPE BODY departmentUdt4 as
  member function getStudents return studentUdtList4
  end func;

  member function getFaculty return facultyUdtList4
  end func;
 end;
 /


CREATE TABLE person4 OF personUdt4(
 primary key (pid));
/

CREATE TABLE faculty4 OF facultyUdt4;
/

CREATE TABLE student4 OF studentUdt4;
/

CREATE TABLE department4 OF departmentUdt4( 
 primary key (code));
/

CREATE TABLE campusClub4 OF campusClubUdt4(
        primary key (cid)
);

INSERT INTO student4
(pid, firstname, lastname, dob, status, memberOf, major)
VALUES
('10','alex','smith','31-may-98','FRESH', '10', '11');

COMMIT;

如果有人可以帮助我,那就太棒了D:

1 个答案:

答案 0 :(得分:1)

(这完全基于我对Oracle对象关系技术的非常有限的了解。有些可能是错误的,并且可能有一种更简单的方法来执行此操作。)

据我了解,REF必须指向实际行。您必须先创建一些数据,然后才能创建一些数据。由于有太多的循环引用,您将不得不稍后返回并更新所有内容。但希望这足以让你开始。

--Create some rows to reference.
insert into campusClub4(cid) values(1);
insert into department4(code) values('A');

--Insert regular columns first.
insert into student4(pid, firstName, lastName, dob, status)
values('10', 'alex', 'smith', to_date('31-MAY-1998', 'DD-MON-YYYY'), 'FRESH');

--Add references with an update.
update student4
set memberOf = (select ref(campusClub) from campusClub4 campusClub where cid = 1)
  ,major = (select ref(department) from department4 department where code = 'A')
where pid = '10';

--Verify data
select pid, firstname, lastname, dob, status, deref(memberOf), deref(major) from student4;

--This would be a simpler method, but it doesn't work and I don't understand why.
insert into student4(pid, firstName, lastName, dob, status)
values('10', 'alex', 'smith', to_date('31-MAY-1998', 'DD-MON-YYYY'), 'FRESH'
  ,(select ref(campusClub) from campusClub4 campusClub where cid = 1)
  ,(select ref(department) from department4 department where code = 'A')
);

但我强烈建议你永远不要这样做。将数据插入表格应该不是那么困难。对象关系数据库可能是一个坏主意。而甲骨文的实施很糟糕。你会得到ORA-600错误和“无效”的表格(例如我刚从交叉加入campusClub4和department4得到一个ORA-600,每个只有一行)。没有人会知道如何使用您的数据。