Как мне вставить данные в таблицы объектов, которые имеют ссылки на другие? - PullRequest
1 голос
/ 28 октября 2010

Я новичок в 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 Ответ

1 голос
/ 29 октября 2010

(Все это основано на моих очень ограниченных знаниях объектно-реляционной технологии 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')
);

Но я настоятельно рекомендую, чтобы вы никогда не делали этого. Вставка данных в таблицу не должна быть такой сложной. Объектно-реляционные базы данных, вероятно, плохая идея. И реализация Oracle это отстой. Вы получите ошибки ORA-600 и «недействительные» таблицы повсюду с этим материалом (например, я только что получил ORA-600 от перекрестного соединения campusClub4 и Department4 с только одним рядом в каждой). И никто не будет знать, как использовать ваши данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...