Вложенные таблицы (Nested Tables).
Вложенная таблица это абстрактный тип данных в Oracle, который позволяет создать колонку в таблице который содержит многозначние данные.
Следующий пример создает таблицу с колонкой вложенной таблицы (Nested Table):
CREATE OR REPLACE TYPE MY_TAB_T AS TABLE OF VARCHAR2(30);
/
CREATE TABLE MY_NESTED_TABLE(
ID1 NUMBER,
COL1 MY_TAB_T)
NESTED TABLE COL1 STORE AS COL1_TAB;
/
/
CREATE TABLE MY_NESTED_TABLE(
ID1 NUMBER,
COL1 MY_TAB_T)
NESTED TABLE COL1 STORE AS COL1_TAB;
/
Результат:
Вставление данных в таблицу:
INSERT INTO MY_NESTED_TABLE VALUES (1,MY_TAB_T('A'));
INSERT INTO MY_NESTED_TABLE VALUES (2,MY_TAB_T('B','C'));
INSERT INTO MY_NESTED_TABLE VALUES (3,MY_TAB_T('D','E','F'));
SELECT из вложенной таблицы:
SELECT ID1,COL1 FROM MY_NESTED_TABLE;
Результат:
ID1 | COL1 |
---|---|
1 | <Collection> |
2 | <Collection> |
3 | <Collection> |
SELECT из таблицы с подтаблицой:
SELECT ID1,COLUMN_VALUE FROM MY_NESTED_TABLE T1,TABLE(T1.COL1) ;
Результат:
ID1 | COLUMN_VALUE |
---|---|
1 | A |
2 | B |
2 | C |
3 | D |
3 | E |
3 | F |
Список и детали вложенных таблиц можно посмотреть в представлениях:
USER_NESTED_TABLES,USER_NESTED_TABLE_COLS,
ALL_NESTED_TABLES,ALL_NESTED_TABLE_COLS,
DBA_NESTED_TABLES,DBA_NESTED_TABLE_COLS.
USER_NESTED_TABLES,USER_NESTED_TABLE_COLS,
ALL_NESTED_TABLES,ALL_NESTED_TABLE_COLS,
DBA_NESTED_TABLES,DBA_NESTED_TABLE_COLS.
Вложенная таблица может состоять из разных столбцов:
CREATE OR REPLACE TYPE T_ADDRESS AS OBJECT(
STREET VARCHAR2(50),
CITY VARCHAR2(30),
STATE VARCHAR2(30),
COUNTRY VARCHAR2(30),
ZIP CHAR(5));
/
CREATE OR REPLACE TYPE ADDRESS_TAB AS TABLE OF T_ADDRESS;
/
CREATE TABLE PERSONS(
ID_PERSON NUMBER,
FIRST_NAME VARCHAR2(30),
LAST_NAME VARCHAR2(30),
ADDRESS ADDRESS_TAB)
NESTED TABLE ADDRESS STORE AS ADDRESS_TABLE;
/
INSERT INTO PERSONS VALUES (1,'АЛЕКСАНДР','ПЕТРОВ',ADDRESS_TAB(
T_ADDRESS('МАРАТА','САНКТ-ПЕТЕРБУРГ','ЛО','РФ',11111),
T_ADDRESS('ДЕКАБРИСТОВ','МОСКВА',' ','РФ',22222)));
/
INSERT INTO TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
VALUES(T_ADDRESS('RUE DIE RIVOLI','PARIS','ILE-DE-FRANCE','FR',33333));
/
SELECT T.FIRST_NAME,T.LAST_NAME,A.* FROM PERSONS T, TABLE(T.ADDRESS) A;
/
UPDATE TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
SET ADDR.STREET='МАРАТА 1'
WHERE ADDR.CITY='САНКТ-ПЕТЕРБУРГ';
/
UPDATE TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
SET VALUE (ADDR)=T_ADDRESS('УЛИЦА РИВОЛИ','ПАРИЖ','ИЛЬ-ДЕ-ФРАНС','ФР',44444)
WHERE VALUE (ADDR)=T_ADDRESS('RUE DIE RIVOLI','PARIS','ILE-DE-FRANCE','FR',33333);
--WHERE ADDR.ZIP=33333;
/
DELETE TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
WHERE ADDR.ZIP=22222;
/
STREET VARCHAR2(50),
CITY VARCHAR2(30),
STATE VARCHAR2(30),
COUNTRY VARCHAR2(30),
ZIP CHAR(5));
/
CREATE OR REPLACE TYPE ADDRESS_TAB AS TABLE OF T_ADDRESS;
/
CREATE TABLE PERSONS(
ID_PERSON NUMBER,
FIRST_NAME VARCHAR2(30),
LAST_NAME VARCHAR2(30),
ADDRESS ADDRESS_TAB)
NESTED TABLE ADDRESS STORE AS ADDRESS_TABLE;
/
INSERT INTO PERSONS VALUES (1,'АЛЕКСАНДР','ПЕТРОВ',ADDRESS_TAB(
T_ADDRESS('МАРАТА','САНКТ-ПЕТЕРБУРГ','ЛО','РФ',11111),
T_ADDRESS('ДЕКАБРИСТОВ','МОСКВА',' ','РФ',22222)));
/
INSERT INTO TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
VALUES(T_ADDRESS('RUE DIE RIVOLI','PARIS','ILE-DE-FRANCE','FR',33333));
/
SELECT T.FIRST_NAME,T.LAST_NAME,A.* FROM PERSONS T, TABLE(T.ADDRESS) A;
/
UPDATE TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
SET ADDR.STREET='МАРАТА 1'
WHERE ADDR.CITY='САНКТ-ПЕТЕРБУРГ';
/
UPDATE TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
SET VALUE (ADDR)=T_ADDRESS('УЛИЦА РИВОЛИ','ПАРИЖ','ИЛЬ-ДЕ-ФРАНС','ФР',44444)
WHERE VALUE (ADDR)=T_ADDRESS('RUE DIE RIVOLI','PARIS','ILE-DE-FRANCE','FR',33333);
--WHERE ADDR.ZIP=33333;
/
DELETE TABLE(SELECT ADDRESS FROM PERSONS WHERE ID_PERSON=1) ADDR
WHERE ADDR.ZIP=22222;
/