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:

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;