74
2002 Prentice Hall. All rights reserved. 1 Pregled 1 Programski blokovi 2 Struktura blokova 3 Procedure 4 Funkcije 5 Upravaljanje procedurama i funkcijama Uvod u PL/SQL programiranje

Lekcija 1. Uvod u PLSQL

Embed Size (px)

DESCRIPTION

Softverski inzinjering Lekcija 1. Uvod u PLSQL PMF PG

Citation preview

Page 1: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

1

Pregled1 Programski blokovi2 Struktura blokova 3 Procedure 4 Funkcije 5 Upravaljanje procedurama i funkcijama

Uvod u PL/SQL programiranje

Page 2: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

2

1 Uvod

• Ciljevi – Kreiranje, izvršavanje procedura, funkcija, trigera

– Upotreba potprograma i trigera u aplikacijama

– Upoznavanje sa nekim osnovnim ugrađenim paketima

– Manipulacija velikim objektima

Page 3: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

3

1 Uvod

• SQL– Deklarativni jezik visokog nivoa apstrakcije– Sastoji se od relativno malog broja komandi(INSERT,

UPDATE, GRANT, DELETE...)– Jednostavan za upotrebu, znatno jednostavniji nego

proceduralni jezici treće generacije– Stotine proceduralnih linija koda su potrebnr da bi

zamijenile jednu SELECT naredbu– Zbog toga ovaj jezik doživljava veliku popularnost– S druge strane, izražajni kapaciteti ovog jezika su ograničeni– Neka ograničenje je teško, pa i nemoguće, definisati putem

SQL mehanizma(poslije prodaje artikla, uvećaj saldo za cijenu i smanji broj artikala u skladištu za jedan, samo artiklima skupljim od 100 se može sniziti cijena za 10%)

– Postoji potreba da se SQL na neki način proširi

Page 4: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

4

1 Uvod

• PL/SQL– Jezik blizak SQL, tj. podržava većinu koncepata jezika SQL

za rad sa bazom podataka

– U sebi sadrži koncepte jezika treće generacije, kao što su uslovno izvršavanje(IF), sekvencijalno izvršavanje programa, iterativno izvršavanje(FOR, WHILE.)

– Centralizovano izvršavanje, tj. programe izvršava server baze podataka

– Programi pisani putem PL/SQL jezika čuvaju se na strani servera, a ne kod klijenata. To podrazumijeva lakše održavanje. Promjena se vrši na jednom mjestu i odmah postaje vidljiva svim klijentima.

Page 5: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

5

1 Uvod

• Pojednostavljeni pogled na PL/SQL i Oracle server

Page 6: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

6

1 Uvod

• Prednosti– Programi pisani putem PL/SQL jezika čuvaju se na strani

servera, a ne kod klijenata. To podrazumijeva lakše održavanje. Promjena se vrši na jednom mjestu i odmah postaje vidljiva svim klijentima.

– Da li je bolje koristi “pravi” jezik kao C? C podržava komunikaciju sa Oracle bazom, ali različite biblioteke različitih proizvođača nijesu 100% kompatibilne. Programi iste namjene pisani u PL/SQL su lakši za pisanje i efikasniji.

– PL/SQL čuva varijable u istom formatu kao i server. Kada koristite programski jezik opšte namjene npr. Java, gubi se vrijeme na preformatiranje podataka. Može se desiti da numerički tip podatka server čuva u jednom formatu, a programski jezik u drugom.

Page 7: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

7

1 Uvod

• Prednosti:– PL/SQL se izvršava u istom memorijskom protoru kao i

server, te se jako malo vremena gubi na komunikaciju.

– PL/SQL kod je interpretiran, ali od verzije 9i uveden je i native execution. PL/SQL kod se prevodi u C kod, a potom u binarni.

Page 8: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

8

1 Uvod

• Nedostaci– Kompanija Oracle je vlasnik, te se on može koristi samo sa

proizvodima te kompanije. Drugi proizovđači ga ne podržavaju

– Malo je alata za rad sa ovim jezikoma, koji komuniciraju direktno sa serverom baze podataka.

– Obično se koristi drugi jezik kao Front-End, koji potom komunicira sa serverom

Page 9: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

9

1 Uvod

• Kako početi:– Instalirati Oracle server baze podataka

– Pristupiti bazi putem neke klijentske aplikacije napr. SQL*Plus.

– Ukoliko koncekcija nije moguća, definisati parametre u fajlu tnsnames.ora

– Moguća je konkecija na udaljene servere, itd.

Page 10: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline10

Struktura PL/SQL bloka

<heade> IS|ASDECLARE //opciono//varijable, kursori i korisnički definisani izuzeci

BEGIN

-SQL naredba-PLSQL naredba

EXCEPTION

END;

Page 11: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline11

Struktura PL/SQL bloka

--Primjer PLSQL bloka

DECLAREv_variable VARCHAR2(5);

BEGINDBMS_OUTPUT.PUT_LINE(‘Hello world’);

EXCEPTIONWHEN exception_name THEN

END;

Page 12: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

12

1 Uvod

• Svaka programska konstrukcija u PL/SQL-u sastoji se od blokova

• Blokovi mogu biti ugnježdeni međusobno• PL/SQL blokovi mogu se izvršavati na

serveru(kao stored procedure, func. itd.), a takođe mogu biti kreirani putem alata kao što su Oracle Forms Developer, Oracle Report Developer, id.

Page 13: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

13

Podjela blokova

Page 14: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

14

Pregled potprograma

Potprogram je imenovani PL/SQL blok kojem se

predaju neki parametri i koji može biti pozvan iz

nekog okruženja

Dijele se na procedure i funkcije– Procedure

•izršavaju neku akciju

– Funkcije

• računaju neku vrijednost

Page 15: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

15

Pregled potprograma

• Upotreba potprograma– Povećava čitljivost koda

– Omogučava lakše odražavanje i ponovnu upotrebu koda

– Programski kod se nalazi na jednom mjestu, pa promjena neke procedure ili funkcije zahtijeva samo jednu izmjenu

– Povećava se sigurnost jer je moguće definisati koji korisnik smije da izvršava određeni blok naredbi

– Takođe, putem potprograma je moguće kontrolisati pristup podacima

Page 16: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

16

Pregled potprograma

• Zaglavlje imenovanih PL/SQL blokova u sebi nosi informaciju o:– Tipu potprograma

– Imenu

– Načinu poziva

– Listi parametra, ako je ima

– Povratnom tipu, ako se radi o funkciji

Page 17: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

17

Deklaracija varijabli

• Vrši se u DECLARE sekciji• Osnovi tipovi podataka

– VARCHAR2 (maximum_length)

– NUMBER [(precision, scale)]

– DATE

– CHAR [(maximum_length)]

– LONG

– LONG RAW

– BOOLEAN

– BINARY_INTEGER

– PLS_INTEGER

Page 18: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

18

Deklaracija varijabli

• Može se vršiti i putem TYPE kvalifikatova– Primjer

...v_ime zaposleni.ime%TYPE...

•Tip podatka za varijablu v_ime je onaj tip podataka koji odgovara koloni ime u tabeli zaposleni

Page 19: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

19

PL/SQL Naredbe

• PL/SQL naredba može biti – Poziv ugrađene ili korisnički definisane funkcije ili

procedure

– IF blok

– WHILE blok

– FOR blok

– ....

Page 20: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

20

PL/SQL Naredbe

• Postoji veliki broj ugrađenih funkcija– Primjer

v_mailing_address := v_name||CHR(10) ||v_address||CHR(10)||v_state|| CHR(10)||v_zip;

•Konverzija imena zaposlenog u mala slova

v_ename:= LOWER(v_ename);

Page 21: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

21

PL/SQL Naredbe

• Funkcije za konverziju:– TO_CHAR(vrijednost, format)

– TO_DATE (vrijednost,format)

– TO_NUMBER (vrijednost, format)

Page 22: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline22

PL/SQL Naredbe

--Primjer upotrebe funkcije za -konverziju

DECLAREv_datum VARCHAR2(15);

BEGINSELECT TO_CHAR(datum_zaposlenja, 'MON. DD, YYYY')INTO v_datumFROM zaposleniWHERE zid = 7839;

END;

Page 23: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

23

PL/SQL Naredbe

• Varijabla v_datum je deklarisana kao DATE, pa ova naredba dovodi do greške

v_datum := 'January 13, 1998';

•Treba koristiti funkciju za konverziju TO_DATE()

v_datum := TO_DATE('January 13, 1998', 'Month DD, YYYY');

Page 24: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

24

PL/SQL Naredbe

• Strukutura select naredbe

SELECT select_list

INTO{variable_name[, variable_name]...| record_name}

FROM table

WHERE condition;

Page 25: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline25

PL/SQL Naredbe

--Primjer upotrebe SELECT naredbe

DECLARE

v_oid NUMBER(2);v_ime VARCHAR2(15);BEGINSELECT oid, imeINTO v_oid, v_imeFROM odjeljenjeWHERE oid = 1;

...END;

Page 26: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline26

PL/SQL Naredbe

--Primjer select naredbe

DECLARE

v_suma_plata zaposleni.plata%TYPE;v_oid NUMBER NOT NULL := 10;BEGINSELECT sum(plata)INTO v_suma_plataFROM zaposleniWHERE oid = v_oid;

...END;

Page 27: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

27

PL/SQL Naredbe

• Strukutura IF naredbe

IF logicki_uslov THEN

lista_naredbi;

[ELSIF logicki_uslov THEN

lista_naredbi;]

[ELSIF logicki_uslov THEN

lista_naredbi;]

Page 28: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline28

PL/SQL Naredbe

--Primjer if naredbe

IF v_ime = 'tehnika' THEN v_id := 10;

END_IF;

Page 29: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline29

PL/SQL Naredbe

--Primjer elsif naredbe

IF v_start > 200 THEN v_iznos := v_iznos * 2;

ELSIF v_start > 300 THEN v_iznos := v_iznos * 3;

ELSIF v_start > 400 THENv_iznos := v_iznos * 4;

END_IF;

Page 30: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

30

PL/SQL Naredbe

• Opsta struktura petlji

LOOP

lista_naredbi;

EXIT [WHEN uslov];

END LOOP

Page 31: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

31

PL/SQL Naredbe

• For i WHILE sintaksa

FOR broja in [REVERSE] donja..gornja LOOP

lista_naredbi;

END LOOP;

WHILE uslov LOOP

lista_naredbi;

END LOOP;

Page 32: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline32

PL/SQL Naredbe

--Primjer FOR naredbe

BEGINFOR brojac in 3..9 LOOP

DBMS_OUTPUT.put_line('i: ' || brojac);END LOOP;

END;

Page 33: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline33

PL/SQL Naredbe

--Primjer while naredbe

brojac NUMBER :=3;

BEGINWHILE brojac < 10 LOOP

DBMS_OUTPUT.put_line('i: ' || brojac);brojac:=brojac +1;

END LOOP;END;

Page 34: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline34

PL/SQL Naredbe

--Primjer ugnježdenih petlji

o_counter NUMBER := 1;i_counter NUMBER := 1;BEGIN

<<outer_loop>>LOOP

EXIT WHEN o_counter > 2;o_counter := o_counter + 1;<<inner_loop>>LOOP

EXIT WHEN i_counter > 3;EXIT outer_loop WHEN i_counter > 2;i_counter := i_counter + 1;DBMS_OUTPUT.put_line('i: ' || i_counter

|| ' j: ' || o_counter);END LOOP inner_loop;

END LOOP outer_loop;END;

i: 2 j: 2

i: 3 j: 2

Page 35: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

35

Upotreba promjenljivih tipa zapisa

• Sintaksa:

TYPE ime_tipa IS RECORD

(deklaracija_polja (, deklaracija_polja)*);

ime_varijable tip;

•Gdje je deklaracija_polja

ime_polja (tip_podatka | tabela.kolona%TYPE)

Page 36: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline36

PL/SQL Naredbe

--Primjer deklaracije zapisa

TYPE odjeljenje_rec_type1 IS RECORD(o_id NUMBER, naziv varchar2(20));odjeljenje_rec1 odjeljenje_rec_type;

TYPE odjeljenje_rec_type2 IS RECORD(o_id odjeljenje.o_id%TYPE, naziv varchar2(20));

Page 37: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

37

Upotreba promjenljivih tipa zapisa

• Jednostavniji način deklaracije varijable tipa zapisa:

odjeljenje_rec odjeljenje%ROWTYPE;

Page 38: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline38

PL/SQL Naredbe

--Upotreba zapisa

TYPE odjeljenje_rec_type IS RECORD(o_id NUMBER, naziv varchar2(20));odjeljenje_rec1 odjeljenje_rec_type;odjeljenje_rec2 odjeljenje%ROWTYPE;

BEGIN

--Ovo je komentar

select * into odjeljenje_rec1 from odjeljenje where o_id = 1;

select * into odjeljenje_rec2 from odjeljenje where o_id = 2;

dbms_output.put_line('ime prvog odjeljenja je :' || odjeljenje_rec1.naziv);

dbms_output.put_line('ime drugog odjeljenja je :' || odjeljenje_rec2.naziv);

END;/

Page 39: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

39

Eksplicitni kursori

•Manipulacija eksplicitnim kursorima

Page 40: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

40

Eksplicitni kursori

•Čitanje podataka putem kursora

Page 41: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

41

Eksplicitni kursori

• Deklaracija kursora

CURSOR ime IS

SELECT naredba

•Ne upotrebljava se ključna riječ into

Page 42: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline42

PL/SQL Naredbe

--Upotreba kursora

CURSOR zap_cursor ISSELECT * FROM zaposleni;

Page 43: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

43

Rad sa kursorom

• Otvaranje

OPEN ime_kursora

• Pristupanje zapisima u kursoru

FETCH ime_kursora INTO var,var...| zapis

• Zatvaranje kursora

CLOSE ime_kursora

Page 44: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

44

Ekplicitni kursori

• Putem atributa kursora moze se doći do informacija li je kursor prazan itd.

• %ISOPEN– Vraća TRUE ako je kursor otvoren

• %NOTFOUND – Vraća TRUE ako posljednji FETCH nije vratio podatke

• %FOUND– Vraća TRUE ako posljednji FETCH je vratio podatke

• %ROWCOUNT – Vraća broj torki koje su učitane do sada

Page 45: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline45

PL/SQL Naredbe

--Upotreba ekplicitnih kursora

CURSOR zap_cursor ISSELECT * FROM zaposleni;zap_rec zaposleni%ROWTYPE;

BEGIN

IF zap_cursor%ISOPEN THENdbms_output.put_line('Kursor je otvoren ');

ELSEdbms_output.put_line('Kursor je zatvoren ');

END IF;

OPEN zap_cursor;

IF zap_cursor%ISOPEN THENdbms_output.put_line('Kursor je otvoren ');

ELSEdbms_output.put_line('Kursor je zatvoren ');

END IF;

OPEN zap_cursor; LOOP

FETCH zap_cursor INTO zap_rec;EXIT WHEN zap_cursor%NOTFOUND;dbms_output.put_line('Zaposleni' || zap_cursor

%ROWCOUNT || '.' || zap_rec.ime || ' ' || zap_rec.jmbg);END LOOP;

END;/

Page 46: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

46

Kursor i FOR naredba

• Sintaksa

FOR ime_zapisa IN ime_kursora

statement_list;

END LOOP;

Page 47: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline47

PL/SQL Naredbe

--Upotreba ekplicitnih kursora

CREATE OR REPLACE PROCEDURE StampajZaposlene2

IS

CURSOR zap_cursor ISSELECT * FROM zaposleni;

BEGIN

FOR zap_rec IN zap_cursor LOOPdbms_output.put_line('Zaposleni' ||

zap_cursor%ROWCOUNT || '.' || zap_rec.ime || ' ' || zap_rec.jmbg);END LOOP;

END;/

Page 48: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline48

PL/SQL Naredbe

--Upotreba ekplicitnih kursora

temp NUMBER DEFAULT 1;BEGIN

FOR zap_rec IN (SELECT * FROM zaposleni) LOOPdbms_output.put_line('Zaposleni ' || temp

|| '.' || zap_rec.ime || ' ' || zap_rec.jmbg);temp := temp + 1;

END LOOP;

END;/

Page 49: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

49

Kursori sa parametrima

• Moguće je definisati i parametrizovane kursore• Sintaksa

CURSOR ime

(ime parametra tip_parametra, ...) IS

SELECT naredba

Page 50: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline50

PL/SQL Naredbe

--Upotreba ekplicitnih kursora

CURSOR zap_cursor(v_oid NUMBER) ISSELECT * FROM zaposleni where o_id = v_oid;zap_rec zaposleni%ROWTYPE;

BEGIN

OPEN zap_cursor(&v_id); LOOP

FETCH zap_cursor INTO zap_rec;EXIT WHEN zap_cursor%NOTFOUND;dbms_output.put_line('Zaposleni' ||

zap_cursor%ROWCOUNT || '.' || zap_rec.ime || ' ' || zap_rec.jmbg);END LOOP;

END;/

Page 51: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

51

Procedure

• Imenovani PL/SQL blokovi naredbi• Sintaksa za kreiranje procedura

CREATE [OR REPLACE] PROCEDURE ime_procedure

(ime_parametra [par_mod] tip_podatka,

ime_parametra [par_mod] tip_podatka, …

)

IS

PL/SQL naredbe

END ime_procedure;

Page 52: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

52

Parametri poziva procedure

• Parametar definiše vrijednost koja će biti predata proceduri pri njenog izvršavanja

• Postoje tri modela predaje parametara proceduri– IN

– OUT

– INOUT

Page 53: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

53

Modeli predaje parametara prilikom poziva procedure

• IN parametri– Ovo je podrazumijevani model predaje parametara

– Predstavljaju vrijednost koja je predata proceduri

– Nije ih moguće mijenjati u okviru tijela procedure

– Ponaša se kao konstanta

– Pri pozivu moguće je predati litaral, izraz, konstantu ili inicijalizovanu varijablu

Page 54: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

54

Modeli predaje parametara prilikom poziva procedure

• OUT parametri – Moraju biti inicijalizovani

– Služe za vraćanje informacija okruženju koje je pozvalo proceduru

– Mora se predati varijabli i nije bitno da li je inicijalizovana ili ne

• IN OUT parametri – Moraju biti specificirani

– Predaju se programu ali se i vraću vrijednost okruženju koje je pozvalo proceduru

– Mora se predati varijabla i ona mora biti inicijalizovana

Page 55: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline55

PL/SQL Naredbe

--Procedura koja uvećava platu zaposlenim

create or replace procedure uvecaj_platu(p_id in zaposleni.z_id%TYPE)as beginupdate zaposleni set plata = plata + 0.1 * plata

where z_id = p_id;end uvecaj_platu;/

Page 56: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline56

PL/SQL Naredbe

--za zadato p_oid vraca naziv odjeljenja u promjenljivu p_ime

create or replace procedure ime_odjeljenja(p_oid in odjeljenje.o_id%TYPE, p_ime OUT odjeljenje.naziv%TYPE)

as beginselect naziv into p_ime from odjeljenjewhere o_id = p_oid;

end;/

Page 57: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline57

PL/SQL Naredbe

--Procedura koja vrsi formatiranje datuma

create or replace procedure formatiraj_datum(p_datum IN OUT varchar2)as

beginp_datum := SUBSTR(p_datum, 1, 2) || '-' ||

SUBSTR(p_datum, 4, 2) || '-' || SUBSTR(p_datum, 7, 4);

end;/

Page 58: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

58

Procedure

• Moguće je vršiti proizvoljno ugnježdavanje procedura, tj. moguće je pozvati jednu proceduru iz tijela druge.

Page 59: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline59

PL/SQL Naredbe

--Procedura koja uvećava platu zaposlenim

CREATE OR REPLACE PROCEDURE uvecaj_platu_svima(p_oid IN odjeljenje.o_id%TYPE)AS

CURSOR zap_cursor (c_oid NUMBER)IS(SELECT * FROM zaposleni WHERE o_id=c_oid);

zap_rec zaposleni%ROWTYPE;BEGINOPEN zap_cursor(p_oid); LOOP

FETCH zap_cursor INTO zap_rec;EXIT WHEN zap_cursor%NOTFOUND;uvecaj_platu(zap_rec.z_id);

END LOOP;COMMIT:

END;/

Page 60: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

60

Kreiranje sekvence

• Primjer:

CREATE SEQUENCE odj_seq;

•Inkrementiranje vrijednosit sekvence

SELECT odj_seq.NEXTVAL FROM SYS.DUAL

Page 61: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline61

PL/SQL Naredbe

--Procedura za unos novog odjeljenja

create or replace procedure unesi_odjeljenje(p_oid in odjeljenje.naziv%TYPE)as begininsert into odjeljenje values(odj_seq.nextval, p_oid);

end;/

Page 62: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

62

Funkcije

• Kreiranje funkcija • Sintaksa

CREATE [OR REPLACE] FUNCTION ime_funkcije

(ime_parametra [par_mod] tip_podatka,

ime_parametra [par_mod] tip_podatka, …

) RETURN tip_podatka

IS

PL/SQL naredbe

END ime_funkcije;

Page 63: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

63

Funkcije

• Parametri se definišu i predaju isto kao kod procedura

• Razlika je u tome što funkcija vraća vrijednost

Page 64: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline64

PL/SQL Naredbe

--Funkcija koja vraća prosječnu platu

create or replace function prosjecna_plata(p_oid in odjeljenje.o_id%TYPE) return numberis prosjek number;begin

select avg(plata) into prosjek from zaposleniwhere o_id = p_oid;

return prosjek;end;/

Page 65: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

65

Funkcije

• Ograničenja poziva funkcija koje su dio neke SQL naredbe– Funckija mora da uzima na IN parametre

– Mora da bude stored

– Uzima samo validne SQL tipove podataka, ne PLSQL

– Vraća samo validne SQL tipove podataka

– Ne smije da sadrži DML rečenice

– Funkcije pozvane iz UPDATE/DELETE naredbe nad tabelom T ne smiju da sadrže DML rečenice nad tabelom T

– Ne smiju da sadrže naredbe koje završavaju transakciju

Page 66: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

66

Upravljanje potprogramima

• Dodjeljivanje privilegija

CREATE (ANY) PROCEDURE

ALTER (ANY) PROCEDURE

DROP (ANY) PROCEDURE

EXECUTE (ANY) PROCEDURE

GRANT EXECUTE ON uvecaj_platu TO STUDENT

•Primjer

Page 67: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

67

Upravljanje potprogramima

• Spisak funkcija i procedura, itd. nalazi se u meta-tabeli koja se naziva USER_OBJECTS– OBJECT NAME

• Ime objekta

– OBJECT_ID• Interni identifikator objekta

– OBJECT_TYPE • Tip objekta, npr. TABLE, PROCEDURE itd.

Page 68: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

68

Upravljanje potprogramima

• Izlistavanje svih procedura i funkcija

SELECT object_name,object_type FROM user_objects

WHERE object_type IN ('PROCEDURE','FUNCTION');

Page 69: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

69

Upravljanje potprogramima

• Izvorni kod procedura i funkcija čuva se u meta-tabeli USER_SOURCE– NAME

• Ime objekta

– TYPE • Tip objekta, npr. FUNCTION

– LINE • Linija

– TEXT

Page 70: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

70

Upravljanje potprogramima

• Dobijanje informacija o izvornom kodu neke procedure

SELECT text FROM user_source

WHERE name = 'uvecaj_platu'

Page 71: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

71

Upravljanje potprogramima

• Greške prilikom kompilacije čuvaju se u tabeli USER_ERRORS– NAME

• Ime objekta

– TYPE• Tip objekta

– SEQUENCE• Redni broj greške

– LINE • Linija na kojoj je došlo do greške

– POSITION • Pozicija u liniji na kojoj je došlo do greške

– TEXT • Tekst poruke greške

Page 72: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

72

Upravljanje potprogramima

• Dobijanje informacija eventualnim greškama

SELECT line, text FROM user_errors

WHERE name = 'uvecaj_platu'

SHOW ERRORS PROCEDURE uvecaj_platu

Page 73: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall. All rights reserved.

73

Upravljanje potprogramima

• Uništavanje procedura i funkcija

DROP PROCEDURE 'uvecaj_platu'

Page 74: Lekcija 1. Uvod u PLSQL

2002 Prentice Hall.All rights reserved.

Outline74

PL/SQL Naredbe

--Dodjeljivanje privilegija

declare l_plsql_body varchar2(1000) ;begin if '&CONNECT' in ('Y','y') then l_plsql_body := 'grant create view to &USER'

execute immediate l_plsql_body; dbms_output.put_line(' Alter session granted ');

end if;end;/

>select granted_role from user_role_privs;