Documente Academic
Documente Profesional
Documente Cultură
Politehnica
Facultatea de Catedra de
Calculatoare
Cuprins Introducere n PL/SQL Blocuri anonime
Calculatoare
Blocuri anonime
Blocuri imbricate
Autori: Rularea blocurilor PL/SQL n SQL*Plus tratare a erorilor
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-
corelat %type.
Observatii:
DECLARE -- variabile bloc 1, bloc 2, bloc 3 modifice comisionul pentru acesta.
BEGIN
BEGIN -- bloc 1
/* ..... */
BEGIN -- bloc 2
BEGIN -- bloc 3 --
EXCEPTION -- tratare erori bloc 3
END; -- bloc 3 Primul bloc face o inregistrare folosind variabile
EXCEPTION -- tratare erori bloc 2 de substituire (&&ecuson);
END; -- bloc 2
EXCEPTION -- tratare erori bloc 1
END; -- bloc 1 ecuson (&ecuson .
END;
10.10.2016 Laborator 1 17 10.10.2016 Laborator 1 18 10.10.2016 Laborator 1 19 10.10.2016 Laborator 1 20
Rularea blocurilor PL/SQL n SQL*Plus Rularea blocurilor PL/SQL n SQL*Plus Rularea blocurilor PL/SQL n SQL*Plus Rularea blocurilor PL/SQL n SQL*Plus
Utilizare
set serveroutput on;
set lines n Permite tabel numit mesaje:
set pages n Permite printarea a n coloane
no_data_found
mesaje,
;
too_many_rows Pentru a vedea rezultatul procedurii se va face un select pe
tabela mesaje:
SQL> SELECT * FROM MESAJE;
Ex. 6. n exem
E ;
-un tabel
;
Tipuri corelate:
%type
%rowtype vector de tipul unui rnd de tabel
Tipurile scalare nu au componente interne, n timp Declararea tipului RECORD se face conform ncepnd cu Oracle9i, pentru tipul RECORD sunt Ex. 5. Un exemplu de utilizare a tipului RECORD.
ce tipurile compuse au componente interne care se
pot manipula. TYPE nume_tip IS RECORD Se poate insera (INSERT) o linie ntr-un tabel utiliznd tipul
Tipuri compuse RECORD;
record Se poate actualiza (UPDATE) o linie ntr-un tabel utiliznd
NULL] {:= | DEFAULT} expresie1], tipul RECORD (cu sintaxa SET ROW);
returneze ntr- .
10.10.2016 Laborator 2 20 10.10.2016 Laborator 2 21 10.10.2016 Laborator 2 22 10.10.2016 Laborator 2 23
Tipul Index-by Table Tipul Index-by Table Tipul Index-by Table Tipul Nested Table
-un tablou imbricat, acesta Ex. 9. Exemplu de folosire al unui tabel imbricat.
Can Be
; Number of Subscript Dense or
pot fi stocate n baza de date; Collection Type Where Created Object Type
Elements Type Sparse
Tabelele indexate nu au constructori; Attribute
;
Associative array
; String or Only in PL/SQL
(or index-by Unbounded Either No
integer block
table)
Comanda de declarare a tipului de date tablou ; Starts dense, Either in PL/SQL
imbricat are sintaxa: Nested table Unbounded Integer can become block or at Yes
declarare. sparse schema level
TYPE nume_tip IS TABLE OF tip_elemente [NOT
Either in PL/SQL
NULL]; niciun element (vida), dar care are valoarea not null.
Variable-size array
Bounded Integer Always dense block or at Yes
(varray)
schema level
Ex. 10. Definirea tipurilor direct n baza de date Ex. 11. Folosirea BULK COLLECT INTO cu varray.
Pentru a insera mai multe valori ntr-o
COLLECT INTO;
Ex. 12. Folosirea BULK COLLECT INTO cu index-by table. Ex. 13. Folosirea BULK COLLECT INTO cu nested table. Pentru a crea un table Ex. 14. Crearea unui tabel cu coloanele definite de utilizator.
definite de dezvoltatori se va folosi un
table(index-by sau nested
RECORD.
-bloc se pot
Tipuri de simboluri compuse: PL/SQL permite o varietate de tipuri de date ce pot fi folosite
folosi att variabilele definite local
program n care acestea pot fi folosite; ;
;
Simbol Descriere
-un sub-bloc se
:= Asignare
care au fost definite sau n orice sub-bloc inclus n acesta; -
=> Asociere
Variabilele declarate ntr-un sub-bloc pot fi folosite doar n nume ca una dintr-un bloc blocului;
.. Rang
acesta sau n sub-blocurile acestuia; superior atunci are prioritate cea
|| Concatenare -se variabila
<< >> Variabilele se pot transmite de la un bloc la sub- ;
;
-- invers; Instructiunile PL/SQL nu sunt case sensitive;
/* */ Comentatiu pe mai multe linii
. confuzii. de la 0-
simboluri speciale.
compuse.
Universitatea Facultatea de
Catedra de
Cuprins Prezentare
Politehnica
Calculatoare
Calculatoare
, cu puterea IF conditions
Laborator 3 de manipulare a datelor, ; THEN statements;
END IF;
conditions
;
le; statements le;
u u
Autori
conditions sunt ndeplinite.
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
imbricate.
IF conditions
Testa i cu id-ul 7698. THEN statements_1; n companie. (testati cu 7876 si 7369)
ELSE statements_2;
END IF;
conditions
statements_1
statements_1
cnd conditions este TRUE
statements_2
cnd conditions este FALSE
,
[<<label_name>>]
conducerii companiei care nu a primit comision, dar CASE expresion
WHEN value1 THEN statements_1; ;
WHEN value2 THEN statements_2;
;
...
[ELSE statements_k;]
END CASE [label_name]; 10%, 15%, 20% sau 25% din venit;
expresion
statements_1 din venit;
expresion = value1
statements_2
expresion = value2
statements_k expresion <>
value1, value2, ...
searched CASE ; :
searched case este:
[<<label_name>>]
CASE
WHEN search_condition1 THEN sequence_of_statements1;
WHEN search_condition2 THEN sequence_of_statements2;
...
WHEN search_conditionN THEN sequence_of_statementsN;
[ELSE sequence_of_statementsN+1;]
END CASE [label_name];
Instruc iunea WHILE Instruc iunea WHILE Instruc iunea WHILE Instruc iunea FOR
Instruc iunea FOR Instruc iunea FOR Instruc iunea FOR Instruc iunea FOR
Observatii: Observatii:
Incrementarea (cazul cu IN) sau decrementarea (cazul IN REVERSE)
; Buclele pot fi imbricate pe mai multe niveluri;
REVERSE n general,
;
bucle care o include, exceptnd cazul cnd este
;
adica nu are niciun
rezultat :
FOR contor IN maxVal .. minVal
GOTO
LOOP tre ;
statements GOTO
END LOOP
dintr-
GOTO: - :
http://docs.oracle.com/database/121/LNPLS/control
statements.htm#LNPLS004
Laborator 4
Tratarea excep ilor Predefinite
Nedefinite
coduri de eroare tip ORA-
programator;
Autori Definite
Conf. Dr. Ing. Alexandru Boicea de programator.
As. Drd. Ing. Ciprian-Octavian
. WHEN exception_1 [OR exception_2 ...] then statements_1; CURSOR_ALREADY_OPEN ORA-06511 -6511
... deschis. Cursorul trebuie nchis nainte de
10.10.2016 Laborator 4 7
10.10.2016 Laborator 4 4 10.10.2016 Laborator 4 5 10.10.2016 Laborator 4 6
-
n formatul PLS-xxxxx, unde xxxxx este codul de EXCEPTION
eroare;
Acest cod este diferit de codul ORA-yyyyy generat de catre programator;
SGBD; -
e PLS ;
-se
Sunt excep
exception_name - ID se
DECLARE RAISE introduce
... de programator
;
exception_name EXCEPTION
statements DECLARE;
...
BEGIN ; RAISE pentru generarea
... Limbajul PL/SQL permite astfel programatorului -
IF condition THEN ; RAISE exception_name
RAISE exception_name
END IF; EXCEPTION.
... DECLARE
EXCEPTION RAISE.
...
WHEN exception_name THEN statements;
...
END;
10.10.2016 Laborator 4 24 10.10.2016 Laborator 4 25 10.10.2016 Laborator 4 26 10.10.2016 Laborator 4 27
mesajului ;
IF
-un bloc, iar acesta nu are
EXCEPTION
- procedurile apelate;
Sintaxa este:
raise_application_error(error_number, message [,
{TRUE | FALSE}])
error_number
eroare -20100.
valori ntre - -20999);
message catre sistemul de gestiune.
;
TRUE|FALSE
-un
- Cursoare implicite
http://docs.oracle.com/database/121/LNPLS/errors.ht Cursoare explicite
departamentul 40 nu are niciun angajat; m#LNPLS007 Laborator 5 Cursoare cu parametri
Cursoare PL/SQL Tipuri de variabile REF CURSOR,
no_data_found;
Autori
cererii SELECT, din cauza aceasta, Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
.
n PL/SQL se cree Ex. 3. Exemplu corect de folosire a unui cursor implicit care
- (SELECT, INSERT, DELETE, UPDATE); :
;
;
Implicite create implicit de catre sistemul de gestiune pentru toate e
nregistrare;
Explicite create de dezvoltatori pentru controlul comenzilor DML De exemplu, - Ex. 2. Exemplu corect de folosire a unui cursor implicit (clauza where
. by table, nested table) cu un BULK COLLECT INTO ntr-un SELECT care :
valori intr-
Cursoarele explicite sunt declarate de catre utilizator cursore_name numele atribuit cursorului
DECLARE -based) este o
; column_names numele coloanelor returnate de cursor
;
table_names numele tabelelor folosite de interogare
; conditions
semnalndu-se eventualele erori de compilare;
atributul %ROWTYPE;
Sintaxa este: parameter
DECLARE parameter_type tipul parametrilor Referirea unui element al variabilei de tip cursor se face
maxim de cursoare care se pot deschide pe parcursul unei sesiuni: CURSOR cursor_name [(<parameter> <parameter_type>)] IS variable
for update lock) selectate de cursor n unei coloane din tabel):
SELECT column_manes FROM table_names
privilegiu de DBA enzile: WHERE conditions baza de date value := variable_name.element_name
select name, value from v$parameter where name like Observatii:
'open_cursors'; identificator, deci
variable cursor_name%rowtype;
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH; ; nici folosi n expresii;
. c
.
cursorului.
10.10.2016 Laborator 5 7 10.10.2016 Laborator 5 8 10.10.2016 Laborator 5 9 10.10.2016 Laborator 5 10
Setul activ de date definite de cursorul c_angajati Ciclul FOR este folosit pentru simplificarea sintaxei de prelucrare a liniilor
managerilor din companie. dintr-un cursor;
este procesat linie cu linie;
ciclul;
Sintaxa este:
DECLARE
liniilor din setul activ;
CURSOR cursor_name IS select ...;
variable cursor_name%rowtype;
BEGIN
; FOR variacle IN cursor_name
LOOP
...
resetate. END LOOP;
END;
10.10.2016 Laborator 5 19 10.10.2016 Laborator 5 20 10.10.2016 Laborator 5 21 10.10.2016 Laborator 5 22
Ciclul FOR Ex. 6. Rescriere exemplu 5 folosind FOR. ntr-un ciclu FOR se poate folosi un SELECT care este tot un cursor, dar SELECT n ciclul FOR.
;
Sintaxa este:
OPEN ; BEGIN
FOR variable IN (SELECT column_manes FROM table_names
FETCH ; WHERE conditions)
LOOP
CLOSE. ...
END LOOP;
END;
Cnd ne referim la rndul curent dintr-un cursor explicit Ex. 9. S din tabela EMP Parametrii permit transmiterea unor valori efective
comenzile SQL pot folosi clauza WHERE CURRENT OF peste 20 ani vechime n companie.
unui cursor cnd acesta este deschis;
cursor_name;
cursorului;
n clauza WHERE ;
FOR UPDATE n definirea scalare, dar nu primesc dimensiuni;
cursorului pentru a se bloca rndurile la deschidere (se face
un lock);
Clauza WHERE CURRENT OF cursor_name se poate folosi si in
.
.
Tipuri de variabile
Cursoare explicite Cursoare explicite Cursoare explicite
-
-un cursor folosind o
.
flexibil al liniilor din baza de date, dar fiecare INSERT sau cereri
RDBMS;
;
Efectuarea, pe ct posibil, a calculelor n cererea SELECT; ;
; -
-
.
Ex. 14
shared pool) poate fi
;
- tabela EMP :
;
nu
Proceduri declarate n cadrul unui bloc dintr-un anumit mediu ( de exemplu, SQL*Plus, Oracle Forms,
programul apelant;
Laborator 6 Proceduri stocate
Oracle Reports etc.)
Subprogramele sunt bazate pe structura de bloc PL/SQL.
t fi
Proceduri PL/SQL Parametrii unei proceduri
Similar unui bloc PL/SQL
folosite
Cursoare n proceduri declarare a parametrilor.
Exista 2 tipuri de subprograme:
proceduri;
Autori
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
Cursoare ca parametric Subprogramele pot fi :
locale (n cadrul altui bloc PL/SQL sau subprogram)
stocate (create cu comanda CREATE)
sunt stocate n baza de date de aceea ele se numesc subprograme stocate.
Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc Proceduri declarate n cadrul unui bloc
-un bloc.
Proceduri stocate Proceduri stocate Parametrii unei proceduri Parametrii unei proceduri
Ex. 4. S , care
r,
,
algoritm:
a) manageri de departament
Vechimea < 32 de ani primesc 20 zile de concediu
Vechimea >= 32 de ani primesc 22 zile de concediu
dintr- .
Tipul Colec ie ca parametr Tipul Colec ie ca parametr Tipul Colec ie ca parametr Tipul Colec ie ca parametr
de date. ntr-
nivelul bazei de date folosindu- a DDL
create;
Pasul III -
table. date parametru un cursor;
Rezolvare: REF CURSOR
Pasul I crearea tipului nested table n
Ex. 8. Folosire cursor ca parametru IN: Ex. 9. Folosire cursor ca parametru OUT: Ex. 10. Folosire cursor ca parametru IN OUT:
Universitatea Facultatea de
Catedra de
Cuprins
Politehnica
Calculatoare
Calculatoare
-
valoare; procedurilor;
Laborator 7 n general,
;
PL/SQL au
;
; sunt declarate;
function_name
Sintaxa : BEGIN block_variables
parameter_name numele unui parametru formal din lista de parametri
DECLARE DECLARE locale folosite n bloc
parameter_type se specifica
FUNCTION function_name [(parameter_name [IN|OUT|IN OUT] block_variables;
precizie block_executable_section
parameter_type,...)] var return_data_type; --
return_data_type se specifica blocului
RETURN return_data_type block_variables; precizie block_exception_section
{IS | AS} BEGIN function_declaration_section
[function_declaration_section] block_executable_section;
BEGIN -- var := function_name[(parametrii)]; function_executable_section IN|OUT|IN OUT
function_executable_section; block_executable_section; RETURN
[EXCEPTION [EXCEPTION date return_data_type var
function_exception_section] block_exception_section] function_exception_section valoare, are tipul return_data_type
END [function_name]; -- END;
cte un RETURN
... END;
temp_puncte .
n SQL*Plus
f_puncte, cerere SQL: cerere SQL:
Laborator 8
Pachete PL/SQL
Autori
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
(private).
global (public) subprogram specifications
.
Corpul unui pachet Corpul unui pachet Corpul unui pachet Corpul unui pachet
, Pasul II
declarate n corpul pachetului vor avea caracter local (privat), deci ,
vor fi accesibile numai n blocurile n care au fost definite;
La primul apel al unui obiect dintr-un pachet, ntregul pachet este pachetului;
coloana mgr. Procedura va insera rezultatele n tabela lista.
Pasul I crearea tabelei lista
.
Fiecare sesiune de lucru are o copie proprie a variabilelor din
pachet;
Pasul V
Exemplu de ambiguitate: , cu
: tipul number, atunci nu mai apare eroarea:
SQL:
DROP PACKAGE BODY package_name;
EXECUTE user_name.package_nane.procedure_name;
n
propriul ;
Triggeri PL/SQL
Crearea unui trigger
Triggeri de tip BEFORE
Laborator 9 Triggeri de tip AFTER
HEN
Triggeri PL/SQL
Autori
Conf. Dr. Ing. Alexandru Boicea
As. Drd. Ing. Ciprian-Octavian
Crearea unui trigger Crearea unui trigger Crearea unui trigger Crearea unui trigger
Unde: BEFORE | AFTER Sintaxa referencing_clauses: Sintaxa pentru crearea unui trigger de sistem este
trigger_name numele triggerului PL/SQL
schema INSTEAD OF REFERENCING {OLD [AS] old_variable NEW [AS] new_variable | CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
- NEW [AS] new_variable OLD [AS] old_variable} {BEFORE | AFTER}
utilizatorului curent
tabel _name numele tabelul/view- INSERT | UPDATE | DELETE {DDL_event_list | DB_event_list}
evenimentul ; ON {DATABASE | SCHEMA}
column numele coloanei (coloanelor) din tabelul/view-ul pe care FOR EACH ROW
Aceste valori se pot folosi att n clauza WHEN [WHEN (condition) ]
WHEN
(old_variable.row_field, new_variable.row_field DECLARE
condition PL/SQL folosindu- e : (de exemplu
:old_variable.row_field, :new_variable.row_field); trigger_variables
trigger_variables . BEGIN
triggerului
trigger_body
trigger_body
END
19.12.2016 Laborator 9 7 19.12.2016 Laborator 9 8 19.12.2016 Laborator 9 9 19.12.2016 Laborator 9 10
Crearea unui trigger Crearea unui trigger Crearea unui trigger Triggeri de tip BEFORE
i,
atunci triggerul este executat de k ori. -a
efectuat cu succes;
;
.
Triggeri de tip BEFORE Triggeri de tip BEFORE Trigger de tip AFTER Trigger de tip AFTER
Trigger created;
- - ori de cte ori se face o modificare n tabela EMP.
succes; avertizare:
Warning: Trigger created with compilation errors.
ca Pentru a vedea erorile de compilare se va folosi comanda - .
show errors.
.
- ceea ce este interzis prin definirea tabelei, ca urmare s-a ; ori de cte ori se face o modificare n tabela emp, dar doar pentru
.
i de
.
gerul nu s- ;
EACH ROW;
n clauza WHEN
.
;
S-
.
- -a
.
UPDATE s-
.
auza WHEN
Pasul III testare trigger -uri, ; Orice view, aflat ntr-un astfel de caz, se poate face sefi
Unele view-uri nu pot fi modificate prin comenzi DML, dar folosind
;
View-urile care nu pot fi modificate prin comenzile UPDATE,
INSERT sau DELETE sunt cele create printr-o interogare care
view-ul respectiv;
-ul creat
Un operator SET sau DISTINCT; -
; acestea nu pot fi modificate direct printr-
Clauzele GROUP BY, ORDER BY, CONNECT BY sau START WITH;
UPDATE, dar pot fi modificate prin trigger.
- ;
O subcerere ntr- ;
Unele metode de JOIN. inserarea ntr-un astfel de view.
-a generat o eroare.
inserarea s-
deoarece s-
echivalente comenzii INSERT, prin inserarea n tabelele DEPT
EMP.
LOG ori
Pentru a vedea structura unui trigger se va interoga view-ul sal din tabela EMP.
; user_source: DROP TRIGGER trigger_name; Tabela LOG
i
:
ALTER TRIGGER trigger_name {ENABLE | DISABLE}
-o, pentru ce
-mm-dd hh-
mi-ss).
19.12.2016 Laborator 9 39 19.12.2016 Laborator 9 40 19.12.2016 Laborator 9 41 19.12.2016 Laborator 9 42