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;

Inapoi la cuprins.

BogSoft 1999