Denne artikel forbliver med samme overskrift, over de næste par emner. Det er fordi at emnerne bl.a. er omkring Oracle's nestede tabel strukturer, objekter, varray's m.fl. Og hver især, er et emne for sig selv. Så for det ikke skal blive alt for uoverskueligt, har jeg delt det op. Vi starter med Oracle's nestede tabeller.

Oracle selv introducerede deres "relationelle model", tilbage i version 8i, med nestede tabeller og varray's. Forinden, i version 7 kom grundstenene, nemlig PLSQL tabeller og records. Navngivningen ændrede sig også løbende for samme ting.

  1. Version 7 PLSQL TABEL
  2. Version 8 Index-by tabeller
  3. Version 9 Associative  Arrays

Dog; er der visse features og nye ting i de forskellige versioner som vi vil se. 

Oracle 10G er dog, det helt store vendepunkt, hvor vi må gentænke, hvordan vores opsætninger ser ud, de-normalisere og inplementere de nye typer. 10G byder på så mange nye typer, eller features om du vil. Et godt eksempel er; at med PLSQL har man jo nok i stor grad, indtil 9i været vant til at hente data by-row, og afhængigt af mængde, tager det jo den tid det tager.

Med BULK COLLECT kan alt hentes på en læsning, med collection-level sammenligning kan du udpege de rækker du skal gøre yderligere ved, med set operatorer kan du spare mange liniers kode og mange timers test. Dette er blot et par af de ting der bydes på.

Nedenstående er; Dictionary data information, definition, eksempler på insert, update og delete m.v. Det er simpelthen den praktiske del vedr. nestede tabeller.

"En nested tabel er en tabel gemt inde i strukturen af en anden tabel, i databasen."
Data Dictionary Objekter colletion$
tab$
type$
dba_nested_tables all_nested_tables user_nested_tables
dba_nested_table_cols all_nested_table_cols user_nested_table_cols
dba_source all_source user_source
dba_tables all_tables user_tables
dba_tab_columns all_tab_columns user_tab_columns
dba_types all_types user_types
System Priviledger CREATE TYPE
CREATE ANY TYPE
DROP ANY TYPE

CREATE TABLE
CREATE ANY TABLE
DROP ANY TABLE
 
Nested Tabel Eksempel CREATE TYPE genres_tab IS TABLE OF book_genre.genre_name%TYPE;
/

CREATE TABLE book_library (
    library_id     NUMBER,
    name           VARCHAR2(30),
    book_genres_tab genres_tab)
    NESTED TABLE book_genres_tab STORE AS genres_table;
/

SELECT table_name, nested
FROM user_tables;

set linesize 121
col table_name format a20
col data_type format a30
col table_type_name format a15
col parent_table_column format a10

SELECT column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name = 'BOOK_LIBRARY';

SELECT table_name, table_type_owner, table_type_name,
parent_table_column
FROM user_nested_tables;
Insert into en Nested Tabel

INSERT INTO book_library (library_id, name, book_genres_tab)
  VALUES (book_library_seq.NEXTVAL,'Brand New Library',
          genres_tab('FICTION','NON-FICTION', 'HISTORY', 'BUSINESS AND FINANCE'));
/

SELECT * FROM book_library;

Update en nested tabel DECLARE
  updated_genres_tab genres_tab;
BEGIN
  updated_genres_tab :=
    genres_tab('FICTION','NON-FICTION','HISTORY','BUSINESS AND FINANCE',
               'SCIENCE','PERIODICALS','MULTIMEDIA');

    UPDATE book_library
    SET book_genres_tab = updated_genres_tab;

END;
/
SELECT * FROM book_library;
Drop en nested tabel

SELECT table_name
FROM user_tables;

DROP TABLE book_library;

"Du kan ikke bare droppe en nested tabel. Istedet for må du først benytte ALTER TABLE .... DROP COLUMN."

desc book_library

ALTER TABLE book_library
DROP COLUMN book_genres_tab;

"Table Unnesting"
Collection Unnesting Demo

"For at kunne operere på collection elementer, kan der benyttes TABLE funktionen."

1.

SELECT column_value FROM TABLE(SELECT book_genres_tab
                               FROM book_library 
                               WHERE name = 'Brand New Library')
   WHERE column_value LIKE '%FICTION%';
/

COLUMN_VALUE
------------------------------
FICTION
NON-FICTION

2.
UPDATE TABLE(SELECT book_genres_tab 
             FROM book_library 
             WHERE name = 'Brand New Library')
  SET column_value   = 'MUSIC AND FILM'
  WHERE column_value = 'MULTIMEDIA';


3.
SELECT column_value FROM TABLE(SELECT book_genres_tab
                               FROM book_library 
                               WHERE name = 'Brand New Library');

COLUMN_VALUE
------------------------------
FICTION
NON-FICTION
HISTORY
BUSINESS AND FINANCE
SCIENCE
PERIODICALS
MULTIMEDIA

Det første udtryk, henter blot individuelle elementer fra vores nestede tabel book_genes_tab i vores book_library database tabel.

Det andet udtryk foretager en individuel opdatering, noget der kun er muligt med nestede tabeller.

Det tredie og sidste udtryk viser en select af alle elementer i den nestede tabel. Dette viser en vigtig funktion af TABLE opereanden. Tidligere kunne man via VARRAY få retuneret en komma seperaretliste af elementer. Ved at benytte TABLE kan elementer "Un-nestes" og data vises som ved en "normal" tabel, top-down.