0% au considerat acest document util (0 voturi)
4 vizualizări22 pagini

Tutorialspoint PLSQL

Documentul oferă informații despre proceduri, funcții, cursori și înregistrări în PL/SQL. Acesta definește sintaxa pentru crearea procedurilor și funcțiilor. Descrie cursori impliciți și expliciți și modul de lucru cu cursori, inclusiv declararea, deschiderea, obținerea și închiderea acestora. De asemenea, discută despre diferite tipuri de înregistrări, cum ar fi înregistrările bazate pe tabele folosind %ROWTYPE, înregistrările bazate pe cursori și înregistrările definite de utilizator, cu un exemplu de înregistrare a unei cărți. Sunt furnizate exemple pentru proceduri, funcții, cursori impliciți și expliciți și accesarea câmpurilor unei înregistrări definite de utilizator.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
4 vizualizări22 pagini

Tutorialspoint PLSQL

Documentul oferă informații despre proceduri, funcții, cursori și înregistrări în PL/SQL. Acesta definește sintaxa pentru crearea procedurilor și funcțiilor. Descrie cursori impliciți și expliciți și modul de lucru cu cursori, inclusiv declararea, deschiderea, obținerea și închiderea acestora. De asemenea, discută despre diferite tipuri de înregistrări, cum ar fi înregistrările bazate pe tabele folosind %ROWTYPE, înregistrările bazate pe cursori și înregistrările definite de utilizator, cu un exemplu de înregistrare a unei cărți. Sunt furnizate exemple pentru proceduri, funcții, cursori impliciți și expliciți și accesarea câmpurilor unei înregistrări definite de utilizator.

Tradus de

ScribdTranslations
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Procedură

Sintaxa simplificată pentru declaraț ia CREATE OR REPLACE PROCEDURE este ca


urmează

CREAȚ I[SA REPLACE]PROCEDURA nume_procedură

[(numele_parametrului[IN|OUT|IN OUT]tip[, ...])]

{ESTI|AI}

ÎNCEPE

procedure_body

FINALIZAREprocedură_nume;

Unde,

procedura-numele specifică numele procedurii.

[OPȚ IUNEA OR REPLACE] permite modificarea unei proceduri existente.

Lista de parametri op ț ionali con ț ine nume, mod ș i tipuri de


[Link] reprezintă valoarea care va fi transmisă din exterior ș i OUT
reprezintă parametrul care va fi folosit pentru a returna o valoare în afara de
procedură.

corp-procedură conț ine partea executabilă.

Cuvântul cheie AS este folosit în locul cuvântului cheie IS pentru a crea un standalone

procedură

Exemplu
CREAȚ I SAU ÎNLOCUIȚ I PROCEDURA saluturi

AS

ÎNCEPE

dbms_output.put_line('Salut lume!');

SFÂRȘ IT;
produci rezultatul următor arătat de–

ÎNCEPUT

salutări

FINALIZARE;

Proceduradeș tergere

DROP PROCEDURĂ nume-procedură;

DROP PROCEDURE salutări;

Exemplu de Mod IN & OUT 1

DECLARAȚ IE

un număr

b număr;

numărul c;

PROCEDURA findMin(x IN număr,y IN număr,z OUT număr)IS

ÎNCEPE

DACĂ x<y ATUNCI

z:=x;

ALTUL

z:=y;

ENDIF;

Sfârș it;

ÎNCEPE
a:=23;

b:=45;

găseș teMin(a,b,c);

dbms_output.put_line(' Minimum de (23, 45) : '||c);

SFÂRȘ IT;

Minimum dintre (23, 45) : 23

Exemplu 2 Mod IN & OUT


DECLARA

un număr

PROCEDURA squareNum(x IN OUT număr) ESTE

ÎNCEP

x:=x*x;

SFÂRȘ IT;

ÎNCEPUT

a:=23;

patratNum(a);

dbms_output.put_line(' Patratul lui (23): '||a);

SFÂRȘ IT;

Patratul lui (23): 529

Funcț ie
Sintaxa pentru instruț iunea CREATE FUNCTION este următoarea:-

CREAȚ I [SAU ÎNLOCUIȚ I] FUNCȚ IA nume_funcț ie


[(numele_parametrului [IN | OUT | IN OUT] tip [, ...])]
ÎNAPOI return_datatype
{ESTE | SUNT}
ÎNCEPE
< funcț ia_corporală >
SFÂRȘ IT [numele_funcț iei];

Unde,

Funcț ia-numele specifică numele funcț iei.

[OR REPLACE] opț iunea permite modificarea unei funcț ii existente.

Lista parametrilor opț ionali conț ine numele, modul ș i tipurile parametrilor.
IN reprezintă valoarea care va fi transmisă din exterior ș i OUT reprezintă
parametru care va fi folosit pentru a returna o valoare în afara procedurii.

Funcț ia trebuie să conț ină o declaraț ie return.

Clauza RETURN specifică tipul de date pe care inten ț ionaț i să-l returna ț i din
funcț ie.

Corpul funcț iei conț ine partea executabilă.

Cuvântul cheie AS este folosit în locul cuvântului cheie IS pentru a crea un element de sine stătător

funcț ie.

Selectaț i * din clienț i;

Creează o declaraț ie de funcț ie pentru :

CREAȚ I SAU ÎNLOCUIȚ I FUNCȚ IA totalCustomers


RETURN număr ESTE

ÎNCEPE

SELECT count(*)intototal

DIN clienț i;

ÎNTORCE total;

SFÂRȘ IT;

Apelarea unei funcț ii acesta funcț ie:

DECLARE

c număr(2);

ÎNCEPE

c:=totalCustomers();

dbms_output.put_line('Numărul total de clienț i: '||c);

SFÂRȘ IT;

Exemplu

Demonstrează declararea, definirea ș i invocarea unei funcț ii simple PL/SQL care


calculează ș i returnează maximul a două valori

DECLEARE

un număr;

numărul b;

c număr;

FUNCȚ IE găseș teMax(x ÎN număr, y ÎN număr)

RETURN număr

ESTE
numărul z;

ÎNCEPE

DACĂ x>y ATUNCI

z:=x;

ALTUL

Z:=y;

ENDIF;

RETURN z;

FINALIZARE;

ÎNCEPE

a:=23;

b:=45;

c:=găseș teMax(a,b);

dbms_output.put_line(' Maximul dintre (23,45): '||c);

SFÂRȘ IT;

Temă: Program recursiv

Cursori
Oracle creează o zonă de memorie, cunoscută sub numele de zona de context.

Acursoris este un pointer către zona de context this. PL/SQL controlează contextul
zonă printr-un cursor.

Un cursor reț ine rândurile (una sau mai multe) returnate de o instrucț iune SQL.

procesează rândurile returnate de instrucț iunea SQL, unul câte unul.

Există două tipuri de cursori −

Cursori implici
Cursorii explici

CursoriImplici
Cursorii implici sunt creaț i automat de Oracle.
Nu există un cursor explicit pentru instrucț iune. Programatorii nu pot
controlează cursorele implicite ș i informaț iile din acestea.
Operaț iunile INSERT, cursorul deț ine datele care trebuie inserate.
Pentru operaț iunile UPDATE ș i DELETE, cursorul identifică rândurile
asta ar fi afectat

Atribut

%GĂSIT

1 Returnează ADEVĂRAT dacă o instrucț iune INSERT, UPDATE sau DELETE a afectat unul sau
mai multe linii sau o declara ț ie SELECT INTO a returnat una sau mai multe linii.

În caz contrar, returnează FALSE.

%INEXISTENT

Opusul logic al %FOUND. Returnează TRUE dacă un INSERT, UPDATE sau


2
Instrucț iunea DELETE nu a afectat niciun rând sau o instrucț iune SELECT INTO nu a returnat nimic

rânduri. Altfel, returnează FALSE.


%ESTEAPERT

3 Întotdeauna întoarce FALSE pentru cursori implici, deoarece Oracle închide SQL-ul
cursorul se închide automat după executarea instrucț iunii SQL asociate.

%ROWCOUNT

4 Returnează numărul de rânduri afectate de un INSERT, UPDATE sau DELETE


declaraț ie, sau returnată de o instrucț iune SELECT INTO.

Exemplu:

DECLARĂ

număr(2)

ÎNCEPE

UPDATE clienț i

SET salariu=salariu+500;

Dacă sql%nu_a_foarte_atins_atunci

dbms_output.put_line('nu au fost selectaț i clienț i');

ELSIF sql%gasit ATUNCI

total_rows:=sql%rowcount;

dbms_output.put_line(total_rows||' clienț i selectaț i ');

ENDIF;

SFÂRȘ IT;
Cursoriiexplici

Cursori explici sunt cursori definiț i de programatori pentru a obț ine mai mult
control asupra zonei de context.
Un cursor explicit ar trebui să fie definit în secț iunea de declaraț ie a
Bloc PL/SQL.
Este creat pe o declaraț ie SELECT care returnează mai mult de un rând.

Sintaxa pentru crearea unui cursor explicit.

CURSOR cursor_name ESTE select_statement;

Lucrul cu un cursor explicit include următorii paș i −

Declararea cursorului pentru iniț ializarea memoriei

CURSOR c_customers IS

SELECT id, nume, adresa FROM clienti;

Deschiderea cursorului pentru alocarea memoriei

DESCHIDE c_customers;

Obț inerea cursorului pentru recuperarea datelor

FETCH c_customers INTO c_id,c_name,c_addr;

Închiderea cursorului pentru a elibera memoria alocată

ÎNCHIDE c_customers;

Exemplu

DECLARE
c_id [Link]%tip;

nume_clienti clienț [Link]%tip;

c_addr [Link]%tip;

CURSOR c_customers este

SELECT id, nume, adresă DIN clienț i;

ÎNCEPE

DESCHIDE c_customers;

CICLU

FETCH c_customers în c_id, c_name, c_addr;


IESI CAND c_customers%nu_a_fost_găsit;

dbms_output.put_line(c_id || ' ' || c_name || ' ' ||


c_addr);
SFÂRȘ ITUL CICLULUI;

ÎNCHIDE c_customers;

SFÂRȘ IT;
DECLARA

c_id [Link]%tip;

c_name [Link]%tip;

c_addr [Link]%tip;

CURSOR c_customersis

SELECT id, nume, adresă DIN clienț i;

ÎNCEPE
DESCHIDE c_customers;

BUCLOȘ

FETCH c_customersintoc_id,c_name,c_addr;

IESI CAND c_customers%nu_se_gaseste;

dbms_output.put_line(c_id||' '||c_name||' '||c_addr);

ENDLOOP;

ÎNCHIDE c_customers;

SFÂRȘ IT;

Înregistrări
Un record este o structură de date care poate conț ine elemente de date de diferite tipuri.
tipuri.
Registrele constau din diferite câmpuri, similare cu o linie dintr-o bază de date
masă.

SQL poate gestiona următoarele tipuri de înregistrări −

Pe baza tabelelor
Înregistrări bazate pe cursor

Înregistrări definite de utilizator

Pe baza tabelei
%ROWTYPE atributul permite unui programator să creeze un tabel-
înregistrări bazate pe bază ș i pe cursor.

Exemplu:

DECLARE
client_rec clienti%tiprow;

ÎNCEPE

SELECT * din customer_rec

DIN clienț i

UNDE id=5;

dbms_output.put_line('ID client: '||customer_rec.id);

dbms_output.put_line('Numele clientului: '||customer_rec.name);

dbms_output.put_line('Adresa Clientului: '||customer_rec.address);

dbms_output.put_line('Salariul Clientului: '||customer_rec.salary);

FINALIZARE;

Înregistrări bazate pe cursor:

Folosind cursorul, a fost recuperat înregistrarea ș i exemplu :

DECLARA

CURSOR customer_curis

id

DIN clienț i;

customer_rec customer_cur%tip_rând;

ÎNCEPUT

DESCHIDE client_cur;

BUCLOADER

FETCH customer_curintocustomer_rec;

IEȘ I CÂND customer_cur%notfound;

DBMS_OUTPUT.put_line(customer_rec.id||' '||customer_rec.nume);

SFÂRȘ IT CICLU;
SFÂRȘ IT;

Înregistrăridefinitedeutilizator:
Tip de înregistrare definit de utilizator care vă permite să definiț i diferitele
structuri de înregistrare.
Aceste înregistrări constau în domenii diferite,
Presupunem că doriț i să ț ineț i evidenț a cărț ilor dvs. într-o bibliotecă.
următoarele atribute despre fiecare carte -

Titlu

Autor

Subiect

ID carte
Sintaxa tipurilor de înregistrare −

TIP
TIPUL_NUMELUI ESTE ÎNREGISTRARE

( nume_camp1 tip_date1 [NU NULL] [:= EXPRESIE IMPLICITĂ],


nume_camp2 tip_date2 [NU NULL] [:= EXPRESIE DEFAULT],
...
nume_campN tip_dateN [NU NULL] [:= EXPRESIE DEFAULT);
nume-înregistrare tip_nume;

Înregistrarea cărț ii este declarată în următorul mod:-

DECLAR

TIP cărț i ESTE ÎNREGISTRARE

(titlu varchar(50),

autor varchar(50)

subiect varchar(100)

id_caracter număr);

carte1 cărț i;

carte2 cărț i;
Accesarea acestui câmp

DECLARĂ

tip cărț ieste înregistrare

(titlu varchar(50),

autor varchar(50)

subiect varchar(100)

id_carte număr);

carte1 cărț i;

carte2 cărț i;

ÎNCEPE

Specificaț ii carte1

Programare C

Nuha Ali

Tutorial de Programare C

book1.book_id:=6495407;

--Cartea2specificaț ii

Facturarea Telecomunicatiilor

Zara Ali

Tutorial de facturare telecom

book2.book_id:=6495700;

--CarteaTiparita1inregistrare

dbms_output.put_line('Titlul cărț ii 1 : '||[Link]);

dbms_output.put_line('Autorul cărț ii 1 : '||[Link]);

dbms_output.put_line('Subiect carte 1 : '||[Link]);

dbms_output.put_line('Cartea 1 id carte : '||book1.book_id);


--Printbook2record

dbms_output.put_line('Titlul cărț ii 2 : '||[Link]);

dbms_output.put_line('Autorul cărț ii 2: '||[Link]);

dbms_output.put_line('Subiect carte 2 : '||[Link]);

dbms_output.put_line('Carte 2 id_carte : '||book2.book_id);

SFÂRȘ IT;

Excepț ii

O excepț ie este o condiț ie de eroare în timpul execuț iei unui program.


SQL le permite programatorilor să prindă astfel de condiț ii
utilizarea blocului EXCEPȚIE în program ș i o acț iune adecvată este
luate împotriva stării de eroare.

Există două tipuri de excepț ii −

Excepț ii definite de sistem


Excepț ii definite de utilizator

Sintaxăpentrugestionareaexcepț ilor
Excepț ia implicită va fi gestionată folosind WHEN others THEN.

DECLARĂ

<secț iunea declaraț iilor>

ÎNCEPE

<comandă executabilă>

EXCEPȚ IE
<gestiune a excepț iilor aici>

CAND exceptia1 ATUNCI

instrucț iuni de gestionare a excepț iilor 1

CAND exception2 ATUNCI

statements de gestionare a excepț iilor 2

CÂND exception3 ATUNCI

instrucț iuni de tratare a excepț iilor 3

........

CÂND alț ii AȘ A

instrucț iuni de manipulare a excepț iilor 3

FINALIZARE;

Exemplu:

DECLAR

c_id [Link]%tip:=8;

c_name [Link]%tip;

c_addr [Link]%tip;

ÎNCEPE

SELECT name, address INTO c_name, c_addr

DIN clienț i

UNDE id=c_id;

DBMS_OUTPUT.PUT_LINE('Nume: '||c_name);

DBMS_OUTPUT.PUT_LINE('Adresă: '||c_addr);

EXCEPȚ IE

CÂND nu_sunt_date_găsite ATUNCI

dbms_output.put_line('Nu există un astfel de client!');


CAND alț ii ATUNCI

dbms_output.put_line('Eroare!');

SFÂRȘ IT;

RidicareaExcepț ilor:

Serverul de baze de date automat de fiecare dată când există o bază de date internă
eroare, dar excepț iile pot fi ridicate explicit de programator prin
folosind comanda RAISE
Sintaxa excepț iei definite de utilizator

DECLARĂ

EXCEPȚ IE

ÎNCEPE

DACĂ condiț ia ATUNCI

RIDICĂ excepț ia_nume;

ENDIF;

EXCEPȚ IE

CAND exception_name ATUNCI

declaraț ie

SFÂRȘ IT;

Exemplu :

DECLARĂ

c_id [Link]%tip;

c_nume [Link]%tip;

c_addr [Link]%tip;
-- excepț ie definită de utilizator

ex_invalid_id EXCEP ȚIE;

ÎNCEPE
Dacă c_id <= 0 atunci

RIDICA ex_invalid_id;

ALTFEL
SELECT nume, adresă ÎNTO INTO c_nume, c_adresă

DIN clienț i

UND e = c_id;

DBMS_OUTPUT.PUT_LINE ('Nume: ' || c_name);

DBMS_OUTPUT.PUT_LINE ('Adresă: ' || c_addr);


SFÂRȘ IT Dacă;

EXCEPȚIE

CÂND ex_invalid_id ATUNCI

ID-ul trebuie să fie mai mare decât zero!


CÂND nu_sunt_date_găsite ATUNCI

dbms_output.put_line('Niciun client de acest fel!');

CAND alț ii ATUNCI

dbms_output.put_line('Eroare!');

SFÂRȘ IT;

DECLARĂ

c_id [Link]%tip:= &cc_id;

c_nume [Link]%tip;

c_addr clienț [Link]ă%tip;

--excepț ie definită de utilizator

ex_invalid_id EXCEP Ț IE;

ÎNCEPUT
DACĂ c_id<=0 ATUNCI

RIDICĂ ex_invalid_id;

ALTFEL

SELECT nume, adresa ÎN c_nume, c_adresă

DE LA clienț i

UNDE id=c_id;

DBMS_OUTPUT.PUT_LINE('Nume: '||c_name);

DBMS_OUTPUT.PUT_LINE('Adresă: '||c_addr);

ENDIF;

EXCEPȚ IE

CÂND ex_invalid_id ATUNCI

ID-ul trebuie să fie mai mare decât zero!

CAND nu_date_gasite ATUNCI

Nu există un astfel de client!

CAND alț ii ATUNCI

dbms_output.put_line('Eroare!');

SFÂRȘ IT;

Declanș atoare

Beneficiile triggerelor
Declanș atoarele pot fi scrise pentru următoarele scopuri −

Generarea automată a unor valori de coloană derivate

Aplicarea integrităț ii referenț iale

Înregistrarea evenimentelor ș i stocarea informaț iilor despre accesul la tabele


Auditare

Replicarea sincronă a tabelelor


Impunerea autorizatiilor de securitate

Prevenirea tranzacț iilor invalide

Sintaxa pentru crearea unui trigger este :-

CREAȚ I[SA ÎNLOCUIȚ I]TRIGER trigger_name

{ÎNAINTE|DUPĂ|ÎN LOC DE}

{INSERARE[SAU] |ACTUALIZARE[SAU] |STERGERE}

[OF nume_col]

PE numele_tabelei

[REFERINȚ A LA VECHE CA o NOUĂ CA n]

PENTRU FIECARE RÂND

CAND(conditie)

DECLARĂ

Declaraț ii-declarative

ÎNCEPE

Declaraț ii executabile

EXCEPȚ IE

Declaraț ii de gestionare a excepț iilor

SFÂRȘ IT;

Unde,

CREAȚ I [SAU ÎNLOCUIȚ I] TRIGGER nume_trigger − Creează sau înlocuieș te un trigger existent
declanș ator cu numele_declanș ator.

{ÎNAINTE | DUPĂ | ÎN LOC DE} − Acesta specifică când va fi declan ș atorul


executat. Clauza INSTEAD OF este folosită pentru a crea un trigger pe o vedere.

{INSERARE [SAU] | ACTUALIZARE [SAU] | Ș TERGERE} − Acesta specifică operaț ia DML.

[OF col_name] - Aceasta specifică numele coloanei care va fi actualizată.


[PE numele_tabelei] - Aceasta specifică numele tabelei asociate cu
declanș ator.

[REFERIRE LA VECHI CA o NOI CA n] - Acest lucru vă permite să faceț i referire la valori noi ș i vechi

pentru diverse declaraț ii DML, cum ar fi INSERT, UPDATE ș i DELETE.

[PENTRU FIECARE RANG] - Acesta specifică un trigger la nivel de rang, adică triggerul va fi

executat pentru fiecare rând afectat. Altfel, triggerul se va executa o singură dată
când instrucț iunea SQL este executată, ceea ce se numeș te un trigger la nivel de tabel.

CÂND (condiț ie) − Aceasta oferă o condiț ie pentru rânduri pentru care declanș atorul ar fi
foc. Această clauză este valabilă doar pentru declanș atoare la nivel de rând.

S-ar putea să vă placă și