FACILITATI ALE PL/SQL, VERSIUNEA 2
Introducere
PL/SQL adauga in versiunea 2 un numar de facilitati noi in limbaj,
multe reflectind imbunatatiri ale RDBMS Oracle, versiunea .7. Acesutea
includ:
* Salvarea subprogramelor PL/SQL
* Tipuri noi de date
* Tabele PL/SQL (variabile array)
* Definirea mai flexibila a inregistrarilor
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'.
Blocul anonim
Este un bloc fara nume. Blocurile anonime erau singurul tip de
bloc in versiunea 1. Aceste blocuri sint declarate in momentul
in care sint rulate, si transmise motorului PL/SQL pentru
compilare inainte de a fi rulate.
Subprogramele
Sint blocuri PL/SQL cu nume. Pot fi declarate fie ca proceduri
fie ca functii. In ultimul caz vor intoarce o valoare atunci
cind sint apelate.
Cu extinderea procedurala a RDMS, subprogramele pot fi stocate
in dictionare de date, de unde pot fi apelate apoi din mai
multe aplicatii cind acel cod este necesar. (Sint diferite de
functiile si procedurile din Form-urile SQL)
Declararea variabilelor si constantelor
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.
Pentru variabile NUMBER
NUMBER
VAlori numerice cu precizia maxima de 38 digiti. Valorile sint
rotunjite la un intreg, exceptind cazul cind este data o scala.
De exemplu NUMBER(7,2) inseamna 7 digiti, cu 2 zecimale
permise. Precizia implicita este 38.
Sinonime pentru NUMBER sint: DECIMAL, FLOAT, INTEGER, REAL si
SMALLINT. Aceste alternative sint pentru infrumusetare. De
exemplu INTEGER(4) poate fi considerat mult mai descriptiv
decit NUMBER(4).
Pentru datele BINARY_INTEGER
BINARY_INTEGER
Este stocat ca un numar binar cu semn, este mult mai eficient
pentru intregii folositi in expresii. Pot avea valori intre
-2147483648 si +2147483647.
NATURAL
Acest subtip al BinaryInteger nu permite numere negative.
positive
La fel ca NATURAL, dar nu accepta valoarea zero
Pentru date CHAR
CHAR
Este utilizat pentru a stoca date caracter cu lungime fixa (la
fel cu coloanele CHAR din Oracle7). Lungimea implicita este 1
caracter, maximul permis este 32767. De exemplu CHAR(20).
Nota: Cind variabile CHAR sint comparate, sint evaluate
folosind blankuri pentru umplere.
VARCHAR2
Se foloseste pentru date cu lungime variabila. Lungimea maxima
este cea de la CHAR, dar valorile VARCHAr sint comparate fara
umplere cu spatii.
VARCHAR
La fel, dar semnificatia comparatiei se poate schimba intr-o
versiune ulterioara.
Date Booleene
Boolean
Pentru a pastra valorile TRUE si FALSE. Rezultatul expresiilor
Booleene pot fi atribuite acestor variabile, si testate apoi in
instructiuni conditionale.
Tipul DATE
DATE
Date valide, ca si coloanele ORACLE tip DATE. Domeniu inter
4712bc si 4712ad.
Tipul RAW
RAW
Pentru a stoca date binare, ca si coloanele RAW ale bazelor de
date. Lungimea maxima este 32767.
Date ROWID
ROWID
Pentru a stoca adrese ROWID in formatul international ROWID.
(adica fara conversia dinamica la date character)
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.
Tipuri noi de date compuse
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_INTEGER
Unde 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;
Atribuire de valori unei tablele
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;
BogSoft 1999