PL/SQL adauga in versiunea 2 un numar de facilitati noi in limbaj, multe reflectind imbunatatiri ale RDBMS Oracle, versiunea .7. Acesutea includ:
In plus, versiunea 2 a PL/SQL accepta toate noile functii SQL din Oracle7,
si toti operatorii SQL de comparare si setare (EXIST, UNION, etc)
Subprograme PL/SQL
In general versiunea 2 accepta doua tipuri de blocuri PL/SQL, 'blocul anonim' si 'subprogramele'.
PL/SQL v2 accepta o mare varietate de tipuri de date, care pot fi utilizate
pentru a declara variabile si constante.
Variabilele pot primii optional o valoare cind sint declarate, si este permisa schimbarea valorii
prin asignari mai tirziu, in cadrul blocului.
Constantele sint identificatori care pastreaza o valoare fixa care trebui
atribuita cind constanta este declarata.
Tipuri scalare
Sint tipuri de date care reprezinta o singura valoare. Principalele tipuri sint cele care corespund coloanelor din bazele de date ORACLE: NUMBER, DATE, CHAR, VARCHAR2, RAW, ROWID. Exista totusi un numar de subtipuri pentru o definire mai specifica a variabilelor. In PL/SQL sint permise variabilele Booleene.
De notat ca unele din tipurile de date acceptate de PL/SQL permit
lungimi care sint mai mari decit cele din coloanele corespunzatoare.
VARCHAR2 si RAW, ca coloane, permit maximum 2000 octeti.
Coloanele CHAR au maximum 255.
Datele caracter din PL/SQL pot fi totusi scrise in coloane LONG ale bazelor
de date daca valoarea lor este prea mare.
Cuvintul cheie DEFAULT
In PL/SQL v2 cuvintul rezervat DEFAULT poate fi optional folosit in atribuiri (:=) pentru a definii valori initiale pentru variabile si constante. De exemplu, expresia:
tax_year SMALLINT :=92;Poate fi rescrisa:
tax_year SMALLINT DEFAULT 92;Cuvintul DEFAULT poate de asemenea sa fie utilizat laparametrii subprogramelor, la parametrii cursoarelor, si cimpurile inregistrarilor utilizator.
In PL/SQL v1, atributul %ROWTYPE permitea crearea de variabile bazate pe coloanele
unei tabele, sau a unor coloane selectate dintr-un cursor explicit.
In versiunea 2, sint 2 noi tipuri compuse, numite inregistrari definite de utilizator
si tabele PL/SQL.
Inregistrari definite de utilizator
Spre deosebire de inregistrarile create cu atributul %ROWTYPE, inregistrarile definite de utilizator permit definirea cimpurilor individual intr-o inregistrare. Aceasta se face in 2 etape; intii definiti tipul inregistrare si apoi puteti declara inregistrari bazate pe acest tip.
Tipul inregistrare este definit cu instructiunea TYPE:
TYPE type-id IS RECORD (field-name1 field-type [NOT NULL] [:=valoare], field-name2 field-type [NOT NULL] [:=valoare], ... );unde valoare este valoarea initiala a cimpului respectiv.
Inregistrarile pot fi declarate apoi bazat pe aceasta structura:
record-id record-type ;Exemplu:
DECLARE TYPe time_type IS RECORD (second INTEGER(2) := 0 , minute INTEGER(2) := 0 , hour INTEGER(2) := 0 ) ; time_rec time_type;
Inregistrarea 'time_rec' va contine acum cimpurile 'second', 'minute', 'hour'. Fiecare va fi initializat cu 0.
Inregistrarile definite de utilizator si cimpurile lor pot primii valori si pot fi foosite in expresii in acelasi fel ca si inregistrarile create cu atributul %ROWTYPE. In plus, o inregistrare definita poate fi utilizata ca tip de date pentru parametrii formali ai unui subprogram.
Inregistrarile pot fi imbricate. Adica, o inregistrare definita anterior poate fi tip de data
a unui cimp dintr-un alt tip de date inregistrare, producind inregistrari in inregistrari.
Tabele PL/SQL
Daca inregistrarile pot reflecta un rind unic, cu mai multe cimpuri, o tabela PL/SQL contine o structura cu un singur cimp, dar cu rinduri multiple. O tabela PL/SQL este bazata pe un tip de coloana, dar permite stocarea unui tabel de valori si accesarea lor printr-o cheie primara (numarul rindului)
Ca si inregistrarile definite, o tabela PL/SQL este definita in 2 pasi.Mai intii se defineste un tip bazat pe un tip de coloana, si apoi se declara o tabela cu acest tip.
Sintaxa:
TYPE type-id IS TABLE OF col-type [NOT NULL] INDEX BY BINARY_INTEGERUnde tipul coloanei poate fi fie un tip utilizat pentru coloane (de exemplu VARCHAR2), sau o referire la o baza de date cu atributul %TYPE.
Exemplu:
DECLARE TYPE ename_type IS TABLE OF CHAR(10) INDEX BY BINARY_INTEGER;
Puteti declara o tabela bazata pe tipul ename_type:
ename_array ename_type;
Numarul de rinduri dintr-o tabela poate creste si descreste dinamic, in functie de numarul de valori asignate. Puteti atribui mai mmulte valori de rind intr-o singura atribuire:
ename_array := ('Jean Luc' , 'Kirk' , 'Scott' );sau individual prin indici:
ename_array(4) := 'troy';
De notat ca rindurile dintr-o baza de date pot fi extrase in rindurile unei tabele PL/SQL sau invers, dar aceasta trebuie facut pe rind, intr-un ciclu. Daca un rind dintr-o tabela este referit intr-o variabila acesta trebuie declarat ca BINARY_INTEGER.
Exemplu:
DECLARE i BINARY_INTEGER := 0; BEGIN FOR rec1 IN (select ename from emp) LOOP i:=i+1; ename_array := rec1.ename; END LOOP; . . -- Tabela ename_array incarcata si gata de actiune . END;