2015-04-16 2 views
0

Я хотел создать следующие 3 - уровневая структура с использованием Oracle аспекты программирования объекта:
- Боссы
- - Менеджеры
- - - Сотрудники

3 уровень вложенности таблиц в SQL

Когда я хочу запустить скрипт для создания таблицы tab_univ_bosses следующего исключения происходит в последней строке:

Error at Command Line:31 Column:3 
Error report: 
SQL Error: ORA-22913: "must specify table name for nested table column or attribute" 
*Cause: The storage clause is not specified for a nested table column 
      or attribute. 
*Action: Specify the nested table storage clause for the nested table 
      column or attribute. 

Error starting at line 33 in command: 
NESTED TABLE managers STORE AS tab_univ_managers 
Error report: 
Unknown Command 

Это мой код:

-- TYPE <EMPLOYEE> 
create or replace 
TYPE type_Employee AS OBJECT (
    name    VARCHAR2(30), 
    department_name  VARCHAR2(30), 
    second_name   VARCHAR2(30), 
    manager    REF type_Employee 
); 

CREATE or replace TYPE type_ListEmployees 
AS TABLE OF type_Employee; 

-- TYPE <MANAGER> 
create or replace 
TYPE type_Manager AS OBJECT (
    userData type_Employee, 
    manager REF type_Employee, 
    listEmployees type_ListEmployees 
); 
NESTED TABLE listEmployees STORE AS tab_univ_employees 

CREATE or replace TYPE type_ListManagers 
AS TABLE OF type_ListEmployees; 

-- BASE TABLE 
CREATE TABLE tab_univ_bosses (
    id  NUMBER PRIMARY KEY, 
    userData type_Employee, 
    managers type_ListManagers 
); 
NESTED TABLE managers STORE AS tab_univ_managers <--- There is a problem... 
+0

Почему вы выбираете эта структура? Разумеется, руководители и руководители тоже работают - вы можете использовать одну таблицу для представления этого (или объекта, если хотите использовать объекты). – MT0

+0

Это моя домашняя работа :) – Wicia

+0

'...); NESTED TABLE listEmployees STORE AS tab_univ_employees это тоже проблема, то есть синтаксическая ошибка – Trinimon

ответ

2

Вы можете сделать это, используя одну таблицу:

create or replace 
TYPE type_Employee AS OBJECT (
    name    VARCHAR2(30), 
    department_name  VARCHAR2(30), 
    second_name   VARCHAR2(30), 
    manager    REF type_Employee 
); 
/

CREATE TABLE Employees OF type_Employee (
    manager SCOPE IS Employees 
) 
/

INSERT INTO Employees VALUES ('Big', 'Admin', 'Boss', NULL); 
INSERT INTO Employees VALUES ('Middle', 'Accounts', 'Manager', (SELECT REF(e) FROM Employees e WHERE name = 'Big' AND second_name = 'Boss')); 
INSERT INTO Employees VALUES ('Other', 'Sales', 'Manager',  (SELECT REF(e) FROM Employees e WHERE name = 'Big' AND second_name = 'Boss')); 
INSERT INTO Employees VALUES ('Junior', 'Accounts', 'Accountant', (SELECT REF(e) FROM Employees e WHERE name = 'Middle' AND second_name = 'Manager')); 
INSERT INTO Employees VALUES ('Junior', 'Sales', 'Salesman',  (SELECT REF(e) FROM Employees e WHERE name = 'Other' AND second_name = 'Manager')); 

-- Get everyone in hierarchical order. 
SELECT name, second_name, department_name, LEVEL 
FROM Employees e 
START WITH manager IS NULL 
CONNECT BY PRIOR name = DEREF(e.MANAGER).name 
AND PRIOR second_name = DEREF(e.MANAGER).second_name 
ORDER SIBLINGS BY name, second_name; 

-- Get the employees which have the manager: 'Middle', 'Manager' 
SELECT name, second_name, department_name 
FROM Employees e 
WHERE DEREF(e.Manager).Name = 'Middle' 
AND DEREF(e.Manager).Second_Name = 'Manager'; 

Однако, если вы действительно хотите использовать эту структуру затем:

create or replace 
TYPE type_Employee AS OBJECT (
    name    VARCHAR2(30), 
    department_name  VARCHAR2(30), 
    second_name   VARCHAR2(30), 
    manager    REF type_Employee 
); 
/

CREATE or replace TYPE type_ListEmployees 
AS TABLE OF type_Employee; 
/

create or replace 
TYPE type_Manager AS OBJECT (
    userData type_Employee, 
    manager REF type_Employee, 
    listEmployees type_ListEmployees 
); 
/

CREATE or replace TYPE type_ListManagers 
AS TABLE OF type_Manager; 
/

CREATE TABLE tab_univ_bosses (
    id  NUMBER PRIMARY KEY, 
    userData type_Employee, 
    managers type_ListManagers 
) 
NESTED TABLE managers STORE AS tab_univ_managers (
    NESTED TABLE listEmployees STORE AS tab_univ_employees 
); 
/
+0

Внутренний STORE AS для listEmployees это то, чего раньше не хватало, но мне нравится ваш первый пример + 1 (хотя для этой ситуации я бы предпочел только реляционные таблицы) – tbone