Oracle
 sql >> Database >  >> RDS >> Oracle

Come utilizzare le tabelle Oracle PLSQL (array associativo o tabella index-by)

Tabelle Oracle PLSQL

  • Le tabelle PLSQL sono tipi di dati compositi.
  • Questi si comportano allo stesso modo degli array tranne per il fatto che non hanno limiti superiori, consentendo loro di estendersi costantemente.
  • Sono anche chiamati indice per tabella
  • La tabella PLSQL contiene due elementi

(1) Una chiave primaria di tipi di dati BINARY_INTEGER che indicizzano la tabella, che non devono necessariamente essere consecutivi. La raccolta viene estesa assegnando valori a un elemento utilizzando un valore di indice che al momento non esiste.
possiamo indicizzare anche per un valore stringa

(2) Una colonna di tipo di dati scalare o record che memorizza l'indice in base agli elementi della tabella

Come definire e dichiarare il tipo di tabella

Per creare tabelle PL/SQL, devi eseguire due passaggi. Innanzitutto, definisci un tipo TABLE, quindi dichiara le tabelle PL/SQL di quel tipo. Puoi definire i tipi TABLE nella parte dichiarativa di qualsiasi blocco, sottoprogramma o pacchetto usando la sintassi

Syntax 
 TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

Se il tipo di elemento è un tipo di record, ogni campo del record deve avere un tipo di dati scalare come CHAR, DATE o NUMBER.

Per specificare il tipo di elemento, puoi utilizzare %TYPE per fornire il tipo di dati di una variabile o di una colonna del database

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

Puoi aggiungere il vincolo NOT NULL a una definizione di tipo TABLE e quindi impedire la memorizzazione di valori null in tabelle PL/SQL di quel tipo:

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

Puoi anche utilizzare %ROWTYPE per specificare il tipo di elemento.

DECLARE 
 TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

si utilizza un tipo di RECORD definito dall'utente per specificare il tipo di elemento:

DECLARE 
 TYPE emp_phonetyp IS RECORD
 (
 Stdcode      PLS_INTEGER,
 phn_number   PLS_INTEGER,
 extension    PLS_INTEGER
 );
 TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;

Dopo aver definito un tipo TABLE, puoi dichiarare tabelle PL/SQL di quel tipo

DECLARE   
 TYPE SalTabTyp IS TABLE OF emp.sal%TYPE 
 INDEX BY BINARY_INTEGER;
 TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
 INDEX BY BINARY_INTEGER;
 sal_tab SalTabTyp;  -- declare PL/SQL table
 emp_tab EmpTabTyp;  -- declare another PL/SQL table

Attributi o metodo della tabella PLSQL

Una tabella PL/SQL ha gli attributi EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT e DELETE.

Semplificano l'utilizzo delle tabelle PL/SQL e la manutenzione delle applicazioni.

plsql_table_name.attribute_name

Gli attributi esistono, PRIOR, NEXT e DELETE accettano i parametri. Ogni parametro deve essere un'espressione che restituisce un valore BINARY_INTEGER o un valore convertibile in modo implicito in quel tipo di dati.

DELETE agisce come una procedura, che viene chiamata come un'istruzione. Tuttavia, gli altri attributi della tabella PL/SQL agiscono come una funzione, che viene chiamata come parte di un'espressione.

Esiste(n) Restituisce true se esiste l'ennesimo elemento nella tabella
conta Restituisce il numero di elementi nella tabella
Primo e ultimo FIRST e LAST restituiscono il primo e l'ultimo numero di indice (il più piccolo e il più grande) in una tabella PL/SQL
PRIOR(n ) restituisce il numero di indice che precede l'indice n in una tabella PL/SQL
AVANTI(n ) restituisce il numero di indice successivo a index n
Elimina DELETE rimuove tutti gli elementi da una tabella PL/SQL. DELETE(n ) rimuove il n esimo elemento. Se n è nullo, DELETE(n ) non fa nulla. DELETE(mn ) rimuove tutti gli elementi nell'intervallo m .. n . Se m è maggiore di n o se mn è nullo, DELETE(mn ) non fa nulla

Tabelle PL/SQL per spostare dati in blocco dentro e fuori tabelle di database o tra applicazioni lato client e sottoprogrammi archiviati.

Come popolare i dati nella tabella PLSQL

Le tabelle con tipi di dati semplici possono essere popolate come:

<variable>(<integer>) := <value>;

Le tabelle con tipi di dati complessi avranno bisogno delle colonne compilate individualmente come:

<variable>(<integer>).<column_name> := <value>;

Oppure da un cursore:

fetch <cursor_name> into <variable>(<integer>);
Type emptabletype  is table of varchar2(10)
Index by binary_integer;
emp_table emptabletyp;
emp_table (1) := ‘good’;
emp_table (2) := ‘bad’’;

Puoi recuperare i dati Oracle in una tabella PL/SQL anche in altri tre modi

a) L'istruzione SELECT INTO ti consente di selezionare una singola riga di dati

Utilizzando l'istruzione SELECT INTO, è possibile selezionare una voce di colonna in un elemento scalare. Oppure puoi selezionare un'intera riga in un elemento del record. Nell'esempio seguente, selezioni una riga dalla tabella del database dept in un record memorizzato dal primo elemento della tabella PL/SQL dept_tab:

DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
...
END;

b) Dichiarazione FETCH

Con l'istruzione FETCH, puoi recuperare un'intera colonna di dati Oracle in una tabella PL/SQL di scalari.

Oppure puoi recuperare un'intera tabella di dati Oracle in una tabella di record PL/SQL.

DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by ith element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
-- process data record
END LOOP;
CLOSE c1;
END;

c) il cursore FOR loop ti consente di recuperare più righe.

DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
n BINARY_INTEGER := 0;
BEGIN
/* Fetch entire columns into PL/SQL tables. */
FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
n := n + 1;
ename_tab(n) := emp_rec.ename;
sal_tab(n) := emp_rec.sal;
END LOOP;
...
END;

Devi leggere questi  altri post PLSQL

Struttura e tipi di blocchi Oracle PLSQL
Record Oracle PLSQL
Domande per interviste Oracle plsql
Esercitazioni rapide su Oracle sql e plsql