Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Tipuri de date compuse

sql



+ Font mai mare | - Font mai mic



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

Tipurile de date compuse (de asemeni si cunoscute sub numele de colectii) sunt:RECORD, TABLE, NESTED TABLE si VARRAY. Se foloseste tipul RECORD pentru a prelucra date de tip diferit, dar aflate in relatie, date ce alcatuiesc o unitate logica. Se foloseste tipul de data TABLE pentru a referi si manipula colectii de date ca un obiect intreg. NESTED TABLES si VARRAY nu vor fi descrise in aceasta lectie.

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.

Constrangerea NOT NULL previne asignarea de NULL-uri tabelei PL/SQL de acel tip. Nu se intializeaza 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.

SQL>  CREATE TABLE top_dogs

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2525
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved