Вложенные таблицы (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; /
Вставление данных в таблицу: 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.
Вложенная таблица может состоять из разных столбцов: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; /
|