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(m , n ) rimuove tutti gli elementi nell'intervallo m .. n . Se m è maggiore di n o se m o n è nullo, DELETE(m , n ) 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