sql >> Databáze >  >> RDS >> Oracle

Oracle PL/SQL – kolekce (vnořené tabulky)

V tomto tutoriálu se naučíte, jak deklarovat a inicializovat kolekce Oracle PL/SQL (vnořené tabulky).

Oracle PL/SQL – vnořené tabulky

Vnořené tabulky jsou velmi podobné tabulkám PL/SQL, které jsou v Oracle známé jako index-by tabulky. Vnořené tabulky rozšiřují funkčnost index-by tabulky přidáním dalších metod sběru (známých jako atributy tabulky pro index-by tabulky) a přidáním možnosti ukládat vnořené tabulky do databázové tabulky, proto se jim říká vnořené tabulky.

Vnořené tabulky lze také manipulovat přímo pomocí SQL a mají k dispozici další předdefinované výjimky.

Kromě těchto zvláštních funkcí je základní funkce vnořené tabulky stejná jako u tabulky PL/SQL. Vnořenou tabulku lze považovat za databázovou tabulku se dvěma sloupci-klíč a hodnota. Jako index-tables , vnořené tabulky mohou být řídké a klíče nemusí být sekvenční.

Deklarování vnořené tabulky

Syntaxe pro vytvoření typu vnořené tabulky je

TYPE název_tabulky  je TABLE OF typ_tabulky  [NOT NULL];

kde název_tabulky je název nového typu a table_type je typ každého prvku ve vnořené tabulce. Table_type může být vestavěný typ, uživatelsky definovaný typ objektu nebo výraz pomocí % TYPE.

Poznámka

Jediným syntaktickým rozdílem mezi tabulkami podle indexu a vnořenými tabulkami je přítomnost klauzule INDEX BY BINARY_INTEGER. Pokud tato klauzule není přítomna, pak je typem vnořený typ tabulky. Je-li tato klauzule přítomna, pak je typem typ indexové tabulky.

Následující deklarativní část kódu zobrazuje některé platné deklarace tabulky:

DECLARE--Definujte typ tabulky na základě typu objektuTYPE t_ClassTab JE TABLE OF Classobj;--Typ založený na %ROWTYPEType t_StudentsTab JE TABLE Studentů%ROWTYPE;--Proměnné výše uvedených typův_ClassList t_ClassesTab; 

Oracle PL/SQL – Inicializace vnořené tabulky

Když je tabulka deklarována jako v předchozím bloku, je inicializována tak, aby byla atomicky NULL, jako typ objektu. Pokud se pokusíte přiřadit k tabulce NULL, zobrazí se chyba „ORA-6531:Odkaz na neinicializovanou kolekci ", která odpovídá předdefinované výjimce COLLECTION_IS_NULL , je zvednutý.

Pokračujeme-li v předchozím příkladu, následující sekce spouštění vyvolá tuto chybu:

BEGIN--Toto přiřazení vyvolá COLLECTION_IS_NULL, protože--v_ClassList je automaticky null.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END; 

Jak tedy inicializovat vnořenou tabulku? To lze provést pomocí konstruktoru. Stejně jako konstruktor typu objektu má konstruktor pro vnořenou tabulku stejný název jako samotný typ tabulky. Jako argument však bere seznam prvků, z nichž každý by měl být typově kompatibilní s typem prvku tabulky.

Následující příklad ilustruje použití konstruktoru tabulky nsat3eed:

DECLARETYPE t_NUmbersTab JE TABULKA ČÍSEL;-- Vytvořte tabulku s jedním prvkem.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Vytvořte tabulku s pěti prvky.v-Primes t_numbersTab :=t_Numbers2Tab(1, 3 , 5, 7);-- Vytvořte tabulku bez prvků.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Přiřadit k v_Tab1(1). Tím se nahradí hodnota ready-- v v_Tab(1), která byla inicializována na -1.v_Tab(1) :=12345;END;

Prázdné stoly

Všimněte si deklarace v_Tab2 v předchozím bloku:

-- Vytvořte tabulku bez prvků.v_Tab2 t_NumbersTab :=t_NumbersTab();

v_Tab2 se inicializuje voláním konstruktoru bez argumentů. Tím se vytvoří tabulka, která nemá žádné prvky, ale není atomicky NULL. Následující blok to ilustruje:

DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50);--Vytvořte tabulku NULL.v_Tab1 t_WordsTab;--Vytvořte tabulku s jedním prvkem, který sám o sobě je NULL.v_Tab2 t_WordsTab :=t_WordsTab :=t_WordsTabBEGIN; .PUT_LINE('v_Tab1 je NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab není NULL');END IF;IF;IF;IF v_Tab2 JE NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 je NULL_NULL');ELSEDBMS_OUTLLv.P notUT );END IF;END;

Pokud spustíme tento blok, dostaneme následující výstup:

v_Tab1 je NULLv_Tab2 není NULL

Klíče při inicializaci

Když je tabulka inicializována pomocí konstruktoru, prvky tabulky jsou číslovány postupně v rozsahu od 1 do počtu prvků zadaných ve volání konstruktoru. Při pozdějším zpracování mohou být hodnoty uložené u některých klíčů smazány (metodou DELETE). když je z databáze vybrána vnořená tabulka, klíče se v případě potřeby přečíslují, aby byly sekvenční jako při inicializaci.

  1. Extrahujte datum (rrrr/mm/dd) z časového razítka v PostgreSQL

  2. Jak získám nezpracovaný, zkompilovaný SQL dotaz z výrazu SQLAlchemy?

  3. Existují nějaké metody, které pomáhají při řešení běžných problémů SQLite?

  4. MySQL dotaz k získání nejprodávanějších produktů