CAPITOLUL 23

Tipuri de date compuse

In acest capitol se arata cum se declara si utilizeaza variabile compuse in PL/SQL. In mod normal, inregistrarile permit aceasta facilitate, permitind reprezentarea unei linii de la o tabela sau un view.

Inregistrari in PL/SQL

CE SUNT? - O variabila care poate tine citeva valori separate - O colectie de cimpuri adresabile CUM SUNT DECLARATE INREGISTRARILE? - utlizand %ROWTYPE se utlizand atribute declarate Single-row structura bazata pe o tabela,sau cursor

Inregistrari in PL/SQL

O inregistrare PL/SQL este o variabila care poate contine valori separate,fiecare adresabila individual. Partile componente ale unei inregistrari se numesc campuri, si au nume care pot fi referentiate in atribuiri sau expresii. Campurile dintr-o inregistare pot avea tipuri de date si marimi diferite. Aceasta inseamna ca inregistrarile sunt foarte avaantajoase cand preluam o linie dintr-un tabel pentru procesare intr-un program PL/SQL.

Atributul %ROWTYPE

Atributul ROWTYPE este folosit pentru declararea unei inregistrari bazata pe o colectie de coloane in tabela de baze de date. Campurile cu inregistrarea isi vor obtine numele si tipul datei lor de la coloanele din tabela sau view referit in declararea inregistrarii.

Cimpurile sint declarate intr-o sectiune bloc DECLARE impreuna cu celelalte tipuri de variabile pe care le-am vazut.


        Sintaxa:

                identifier reference%ROWTYPE ;

Unde 'identifier' este numele ales pentru inregistrare ca un intreg, si reference este numele unei tabele, view sau cursor pe care se bazeaza inregistrarea. Aceasta referinta trebuie sa vie valida la momentul cind inregistrarea este declarata, adica trebuie sa existe.


        Examplu:

                DECLARE

                emp_rec emp%ROWTYPE

                BEGIN

                SELECT * INTO emp_rec FROM emp WHERE empno = 7788;

In exemplul de deasupra, inregistrarile 'emp_rec'continind cimpuri bazate pe fiecare coloana in tabla 'emp'. Cimpul va fi populat cu linia selectata de catre numele inregistrari din clauza INTO a instructiunii SELECT.

Starea inregistrarii emp_rec este aratata mai jos:


Empno Ename Job ...

7788  SCOTT ANALYST ...

Cimpurile dintr-o inregistrare pot fi referite individual, atit in PL/SQL cit si in instructiunile SQL care apar intr-un bloc.


Exemplu:

   IF emp_rec.sal < 2000 AND emp_rec.job = 'MANAGER'

      THEN underpaid := TRUE ;

      END IF;



   review_date := emp_rec.hiredate +90 ;



   INSERT INTO emp_history(empno, job, sal, date_stamp)

   VALUES (emp_rec.empno, emp_rec.job, emp_rec.sal, SYSDATE);

O intreaga inregistrare poate fi asignata ca valoare unei alte inregistrari, daca tabelele folosite pentru definirea lor se potrivesc.


 EXEMPLU:

 DECLARE

          record1 salgrade%ROWTYPE;

          record2 salgrade%ROWTYPE;

 BEGIN

         .

         record2:=record1;

O intrega inregistrare NU poate fi trecuta listei VALUES al instructiunii INSERT.Trebuie sa parcurgeti fiecare camp separat.


 EXEMPLU

     INSERT INTO salgrade (grade,losal, hisal) VALUES(record1);--

     Illegal



     INSERT INTO salgrade(grade, losal, hisal)

       VALUES(record1.grade, record1.losal, record1.hisal);--legal

Si va vom arata in urmatorul capitol, ca atributul %ROWTYPE poate fi utilizat pentru a declara inregistrari bazate pe cursoare explicite. Aceste inregistrari pot fi utilizate in FETCHuri si in cicluri cu cursor FOR .

Inregistrari definite de utilizatori

Versiunea 2 PL/SQL permite deasemenea sa fie definite si crete independent tabela de structuri. Aceste inregistrari definite de utilizator va permit sa numiti explicit campurile si sa le definiti tipurile.

In anexa veti gasi informatii suplimentare.

MANIPULAREA %ROWTYPE INREGISTRARI SI CAMPURI

EXEMPLUL 1 -copierea intregilor inregistrari

  DECLARE

  record 1 salgrade%ROWTYPE;

  record 2 salgrade%ROWTYPE;

BEGIN

.

record2:=record1;

EXEMPLU2 -- scrierea unei tabele

 INSERT INTO emp_history(empno,job,sal,date_stamp)

 VALUES(emp_rec.empno,emp_rec.job,emp_rec.sal.,SYSDATE);