CATEGORII DOCUMENTE |
Tipuri de date compuse
Scopul
lectiei
In aceasta lectie veti invata mai multe lucruri despre tipurile de date compuse si utilizarea lor.
Inregistrari si tabele
O inregistrare este un grup de articole ce contin date aflate in relatie, stocate in campuri fiecare avand numele si tipul propriu. O tabela contine o coloana si o cheie primara pentru a oferi acces la linii ca intr-un tabel. Odata definite tabelele si inregistrarile pot fi refolosite.
Pentru mai multe informatii a se vedea:
PL/SQL User's Guide and Reference, Release 8, "Collection and Records".
Inregistrari PL/SQL
O inregistrare este un grup de articole ce contin date aflate in relatie, stocate in campuri fiecare avand numele si tipul sau propriu. Spre exemplu, presupunand ca avem tipuri de date diferite despre un angajat, cum ar fi: nume, salariu, data nasterii samd. Aceste date sunt diferite ca tip, dar sunt in relatie din punct de vedere logic. O inregistrare care contine astfel de campuri: nume,salariu si data nasterii a unui angajat ofera posibilitatea de a trata acest tip de data ca o unitate logica. Cand se declara tipul de record pentru aceste campuri, ele pot fi manipulate ca o unitate.
Fiecare inregistrare definita poate avea atatea campuri de cate este nevoie
Se pot asigna valori initiale inregistrarilor si pot fi definite ca NOT NULL
Campurile care nu au valori initiale sunt initializate cu NULL
Cuvantul cheie DEFAULT poate fi utilizat cand se definesc campurile
Se pot defini tipurile RECORD si declara inregistrari definite de utilizator in partea declarativa a oricarui bloc, subprogram sau pachet.
Se pot defini si referi inregistrari imbricate. O inregistrare poate fi o componenta a altei inregistrari.
Definirea si
declararea unei inregistrari PL/SQL
Pentru a crea o inregistrare, se defineste tipul RECORD si apoi se declara inregistrarea de tipul respectiv.
In sintaxa,
type_name este numele tipului RECORD, acest identificator poate fi utilizat pentru a declara inregistrari.
field_name este numele unui camp din inregistrare.
field_type este tipul de data pentru camp. El reprezinta orice tip de data prezent in PL/SQL exceptand REF CURSOR. Se pot folosi si atributele %TYPE si %ROWTYPE
expr este de tip field_type sau o valoare initiala.
Constrangerea NOT NULL previne asignarea la acele campuri de NULL-uri. Fiti siguri ca ati initializat aceste campuri cu NOT NULL.
Crearea unei inregistrari PL/SQL
Declaratiile pentru campuri sunt la fel ca declaratiile de variabile. Fiecare camp are un nume unic si un tip de data specific. Nu sunt tipuri de date predefinite pentru inregistrarile PL/SQL asa cum sunt pentru variabilele scalare. In primul rand, trebuie sa creati mai intii tipul de data si apoi sa declarati un identificator utilizand acest tip de data.
In urmatorul exemplu se poate folosi atributul %TYPE pentru a specifica tipul unui camp:
DECLARE
TYPE emp_record_type IS RECORD
(empno NUMBER(4) NOT NULL := 100,
ename emp.ename%TYPE,
job emp.job%TYPE);
emp_record emp_record_type;
Nota: Se pot adauga constrangerile NOT NULL oricarei declaratii de camp si in acest fel se previne asignarea de NULL-uri pentru acele campuri. Nu uitati ca aceste campuri declarate ca fiind NOT NULL trebuie initializate.
Referirea si initializarea inregistrarilor
Campurile dintr-o
inregistrare sunt accesate prin nume. Pentru a referi sau initializa un camp
individual, se poate folosi notatia cu punct si urmatoarea sintaxa:
record_name.field_name
Spre exemplu se refera campul job din inregistrarea emp_record dupa cum urmeaza:
emp_record.job
Apoi se poate asigna o valoare campului din inregistrare dupa cum urmeaza:
emp_record.job := 'CLERK';
Intr-un bloc sau subprogram inregistrarile definite de utilizator sunt instantiate atunci cand este introdus blocul sau subprogramul si inceteaza sa existe cand se iese din bloc sau subprogram.
Asignarea valorilor la inregistrari
Puteti asigna o lista de valori comune unei inregistrari prin utilizarea comenzilor SELECT si FETCH. Fiti siguri ca numele coloanelor apar in aceeasi ordine ca si campurile din inregistrarea dumneavoastra. De asemeni puteti sa asignati o inregistrare altei inregistrari daca ele au aceleasi tipuri de date. O inregistrare definita de utilizator si o inregistrare cu atributl %ROWTYPE nu au niciodata aceleasi tip de date.
Declararea inregistrarilor cu
atributul %ROWTYPE
Pentru a declara o inregistrare bazata pe o colectie de coloane din tabela unei baze de date sau a unui VIEW se foloseste atributul %ROWTYPE. Campurile inregistrarii iau numele si tipurile datelor din coloanele tabelei sau a VIEW-ului. Inregistrarea poate stoca o intreaga linie de date extrasa dintr-un cursor sau o variabila cursor.
In exemplul urmator o inregistrare este inregistrata utilizand %ROWTYPE ca un specificator de tip de data.
DECLARE
emp_record emp%ROWTYPE;
Inregistrarea emp_record va consta in urmatoarele campuri, care sunt de fapt campuri ce apartin tabelei EMP.
(ename VARCHAR2(10),
job VARCHAR2(9),
sal NUMBER,
comm NUMBER)
Declararea
inregistrarilor cu atributul %ROWTYPE (continuare)
DECLARE
identifier reference%ROWTYPE;
unde :
identifier este numele ales pentru inregistrare.
reference este numele tabelului, VIEW-ului, cursorului sau variabilei cursor pe inregistrarile se bazeaza. Trebuie sa fiti siguri ca aceasta referinta este valida cind declarati inregistrarea (si aceasta este valida cand tabela sau VIEW-ul exista).
Pentru a referi un camp individual, puteti folosi notatia cu punct si urmatoarea sintaxa:
record_name.field_name
De exemplu, puteti referi campul comm din inregistrarea emp_record dupa cum urmeaza:
emp_record.comm
Puteti asigna o valoare unui camp din inregistrare dupa cum urmeaza:
emp_record.sal:=75000;
Exemple:
Prima declaratie din primul slide creaza o inregistrare avand cimpuri ce au acelasi nume si tip cu cele ale unei linii din tabela DEPT. Campurile sunt: DEPTNO, DNAME si LOCATION. In a doua declaratie se creaza o inregistrare avand campuri ce au acelasi nume si tip cu cele ale unei linii din tabela EMP. Aceste campuri sunt: EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM si DEPTNO.
In exemplul urmator, se selecteaza valorile unei coloane intr-o inregistrare numita item_record.
DECLARE
item_record item%ROWTYPE;
BEGIN
SELECT * INTO item_record
FROM item
WHERE .
Tabele PL/SQL
Obiectele de tipul TABLE sunt numite tabele PL/SQL. Ele sunt modelate ca si tabelele bazelor de date (dar nu in totalitate ca acestea). Tabelele PL/SQL utilizeaza o cheie primara pentru a oferi un acces la linii asemanator cu cel al liniilor unui tablou.
O tabela PL/SQL:
Este similara unui tablou
Trebuie sa contina doua componente:
o cheie primara de tipul BINARY_INTEGER care indexeaza tabela PL/SQL
o coloana avand date de tip scalar sau record, care stocheaza elementele tabelei PL/SQL
Se poate incrementa dinamic deoarece nu exista constrangeri
Declararea
tabelelor PL/SQL
Sunt doi pasi necesari pentru crearea unei tabele PL/SQL
declararea tipului TABLE
declararea unei variabile de acest tip
In sintaxa:
type_name este numele tipului table. Este un specificator de tip utilizat in declaratii ulterioare de tabelele PL/SQL.
column_type este orice tip de data scalar (nu compus) cum ar fi VARCHAR2, DATE sau NUMBER. Se poate folosi atributul %TYPE pentru a furniza tipul datelor unei coloane.
identifier este numele unui identificator care reprezinta intreaga tabela PL/SQL.
Declararea unei variabile PL/SQL pentru a stoca data:
DECLARE
TYPE date_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
date_table date_table_type;
Structura tabelei PL/SQL
Asemanator dimensiunii bazei de date, dimensiunea unei tabele PL/SQL nu are constrangeri. Aceasta este egala cu numarul de linii dintr-o tabela PL/SQL care se incrementeaza dinamic, astfel incat tabela PL/SQL creste cu numarul de linii adaugate.
Tabelele PL/SQL pot avea o coloana si o cheie primara, niciuna neavand nume. Coloana poate apartine oricarui tip de data scalar sau record, dar cheia primara trebuie sa apartina tipului BINARY_INTEGER. Nu se poate initializa o tabela PL/SQL in declaratia sa.
Crearea
unei tabele PL/SQL
Nu sunt tipuri de date predefinite pentru inregistrarile PL/SQL, asa cum exista pentru variabilele scalare. In primul rand trebuie sa creati tipul de data si apoi sa declarati un identificator utilizand acest tip de data.
Referirea unei tabele PL/SQL
Sintaxa :
pl/sql_table_name(primary_key_value)
unde : primary_key_value apartine tipului BINARY_INTEGER
Referirea celei de-a treia linii din tabela PL/SQL ename_table:
ename_table(3)
Intervalul in care poate lua valori un BINARY_INTEGER este: -2147483647 2147483647, astfel incat cheia primara poate fi negativa. Nu este necesar ca indexarea sa inceapa de la 1.
Nota: Apelul table.EXISTS(i) intoarce TRUE daca cel putin o linie cu indexul i este returnata. Folositi apelul EXISTS pentru a preveni o eroare determinata de apelul unui element inexistent al tabelei.
Tabela
de inregistrari PL/SQL
Deoarece numai o definire a tabelei este necesara pentru a pastra informatii despre toate campurile din tabela unei baze de date, tabela de inregistrari creste cu mult functionabilitatea tabelelor PL/SQL.
Referirea la o tabela de inregistrari
In exemplul dat in slide, se pot referi campurile din inregistrarea dept_table deoarece fiecare elemnt al acestei tabele este o inregistrare.
Sintaxa:
table(index).field
Exemplu:
dept_table(15).location:='Atlanta';
Location reprezinta un camp din tabela DEPT.
Nota: Se poate folosi atributul %ROWTYPE pentru a declara o inregistrare care reprezinta o linie intr-o tabela a unei baze de date. Diferenta dintre atributul %ROWTYPE si tipul de data compus RECORD este ca RECORD permite specificarea tipurilor campurilor din inregistrare sau declararea campurilor proprii.
O metoda a unei tabele PL/SQL este o procedura sau o functie care opereaza in tabele si este apelata folosind notatia cu punct.
Sintaxa:
table_name.method_name[(parameters)]
Metoda |
Descriere |
EXISTS(n) |
Returneaza TRUE daca al n-lea element din tabela PL/SQL exista. |
COUNT |
Returneaza numarul curent de elemente pe care o tabela PL/SQL le contine. |
FIRST LAST |
Returneaza primul si ultimul (cel mai mic si cel mai mare) index al numerelor dintr-o tabela PL/SQL. Retuneaza NULL daca tabela PL/SQL este vida. |
PRIOR(n) |
Returneaza indexul ce precede indexul n in tabela PL/SQL. |
NEXT(n) |
Returneaza indexul care succede indexul n in tabela PL/SQL. |
EXTEND(n,i) |
Pentru a creste dimensiunea unei tabele. EXTEND adauga un element nul intr-o tabela PL/SQL. EXTEND(n) adauga n elemente nule la o tabela PL/SQL. EXTEND(n,i) adauga n copii ale elementului i la o tabela PL/SQL. |
TRIM |
TRIM sterge un element de la sfarsitul unei tabele PL/SQL. TRIM(n) sterge n elemente de la sfarsitul unei tabele PL/SQL. |
DELETE |
DELETE sterge toate elementele dintr-o tabela PL/SQL. DELETE(n) sterge al n-lea element din tabela PL/SQL. DELETE(m,n) sterge toate elementele de la rangul mn dintr-o tabela PL/SQL |
Lucrare practica
In aceasta lucrare definiti, creati si utilizati tabele PL/SQL.
Lucrarea practica
Creati o tabela noua pentru stocarea angajatilor si salariile lor.
2 (name VARCHAR2(25),
3 salary NUMBER(11,2));
Scrieti un bloc PL/SQL pentru a extrage numele si salariul unui angajat din tabela EMP, dandu-se numarul angajatului.
a. Declarati doua tabele PL/SQL, ENAME_TABLE si SAL_TABLE, pentru stocarea temporara a numelor si salariilor.
b. Pe masura ce extrageti numele si salariul, stocati-le in tabelele PL/SQL.
c. Transferati numele si salariile din tabelele PL/SQL in tabela TOP_DOGS.
d. Afisati continutul tabelei.
Va rog introduceti numarul angajatului : 7934
PL/SQL procedure successfully completed.
NAME SALARY
MILLER 1300
Va rog introduceti numarul angajatului : 7876
PL/SQL procedure successfully completed.
NAME SALARY
ADAMS 1100
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2729
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved