1 Uvod u PLSQL programiranje Pregled 1 2

  • Slides: 74
Download presentation
1 Uvod u PL/SQL programiranje Pregled 1 2 3 4 5 Programski blokovi Struktura

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

2 1 Uvod • Ciljevi – – Kreiranje, izvršavanje procedura, funkcija, trigera Upotreba potprograma

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 2002 Prentice Hall. All rights reserved.

3 1 Uvod • SQL – Deklarativni jezik visokog nivoa apstrakcije – Sastoji se

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 2002 Prentice Hall. All rights reserved.

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

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. 2002 Prentice Hall. All rights reserved.

5 1 Uvod • Pojednostavljeni pogled na PL/SQL i Oracle server 2002 Prentice Hall.

5 1 Uvod • Pojednostavljeni pogled na PL/SQL i Oracle server 2002 Prentice Hall. All rights reserved.

6 1 Uvod • Prednosti – Programi pisani putem PL/SQL jezika čuvaju se na

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. 2002 Prentice Hall. All rights reserved.

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

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 9 i uveden je i native execution. PL/SQL kod se prevodi u C kod, a potom u binarni. 2002 Prentice Hall. All rights reserved.

8 1 Uvod • Nedostaci – Kompanija Oracle je vlasnik, te se on može

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 2002 Prentice Hall. All rights reserved.

9 1 Uvod • Kako početi: – Instalirati Oracle server baze podataka – Pristupiti

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. 2002 Prentice Hall. All rights reserved.

<heade> IS|AS DECLARE //opciono //varijable, kursori i korisnički definisani izuzeci BEGIN Outline 10 -SQL

<heade> IS|AS DECLARE //opciono //varijable, kursori i korisnički definisani izuzeci BEGIN Outline 10 -SQL naredba -PLSQL naredba EXCEPTION Struktura PL/SQL bloka END; 2002 Prentice Hall. All rights reserved.

--Primjer PLSQL bloka Outline 11 DECLARE v_variable VARCHAR 2(5); BEGIN DBMS_OUTPUT. PUT_LINE(‘Hello world’); EXCEPTION

--Primjer PLSQL bloka Outline 11 DECLARE v_variable VARCHAR 2(5); BEGIN DBMS_OUTPUT. PUT_LINE(‘Hello world’); EXCEPTION WHEN exception_name THEN END; Struktura PL/SQL bloka 2002 Prentice Hall. All rights reserved.

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

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. 2002 Prentice Hall. All rights reserved.

13 Podjela blokova 2002 Prentice Hall. All rights reserved.

13 Podjela blokova 2002 Prentice Hall. All rights reserved.

14 Pregled potprograma Potprogram je imenovani PL/SQL blok kojem se predaju neki parametri i

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 2002 Prentice Hall. All rights reserved.

15 Pregled potprograma • Upotreba potprograma – Povećava čitljivost koda – Omogučava lakše odražavanje

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 2002 Prentice Hall. All rights reserved.

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

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 2002 Prentice Hall. All rights reserved.

17 Deklaracija varijabli • Vrši se u DECLARE sekciji • Osnovi tipovi podataka –

17 Deklaracija varijabli • Vrši se u DECLARE sekciji • Osnovi tipovi podataka – – – – – VARCHAR 2 (maximum_length) NUMBER [(precision, scale)] DATE CHAR [(maximum_length)] LONG RAW BOOLEAN BINARY_INTEGER PLS_INTEGER 2002 Prentice Hall. All rights reserved.

18 Deklaracija varijabli • Može se vršiti i putem TYPE kvalifikatova – Primjer .

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 2002 Prentice Hall. All rights reserved.

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

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 –. . 2002 Prentice Hall. All rights reserved.

20 PL/SQL Naredbe • Postoji veliki broj ugrađenih funkcija – Primjer v_mailing_address : =

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); 2002 Prentice Hall. All rights reserved.

21 PL/SQL Naredbe • Funkcije za konverziju: – TO_CHAR(vrijednost, format) – TO_DATE (vrijednost, format)

21 PL/SQL Naredbe • Funkcije za konverziju: – TO_CHAR(vrijednost, format) – TO_DATE (vrijednost, format) – TO_NUMBER (vrijednost, format) 2002 Prentice Hall. All rights reserved.

--Primjer upotrebe funkcije za konverziju DECLARE v_datum VARCHAR 2(15); BEGIN SELECT TO_CHAR(datum_zaposlenja, 'MON. DD,

--Primjer upotrebe funkcije za konverziju DECLARE v_datum VARCHAR 2(15); BEGIN SELECT TO_CHAR(datum_zaposlenja, 'MON. DD, YYYY') INTO v_datum FROM zaposleni WHERE zid = 7839; END; Outline PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 22

23 PL/SQL Naredbe • Varijabla v_datum je deklarisana kao DATE, pa ova naredba dovodi

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'); 2002 Prentice Hall. All rights reserved.

24 PL/SQL Naredbe • Strukutura select naredbe SELECT select_list INTO{variable_name[, variable_name]. . . |

24 PL/SQL Naredbe • Strukutura select naredbe SELECT select_list INTO{variable_name[, variable_name]. . . | record_name} FROM table WHERE condition; 2002 Prentice Hall. All rights reserved.

--Primjer upotrebe SELECT naredbe Outline DECLARE v_oid NUMBER(2); v_ime VARCHAR 2(15); BEGIN SELECT oid,

--Primjer upotrebe SELECT naredbe Outline DECLARE v_oid NUMBER(2); v_ime VARCHAR 2(15); BEGIN SELECT oid, ime INTO v_oid, v_ime FROM odjeljenje WHERE oid = 1; . . . END; PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 25

--Primjer select naredbe Outline DECLARE v_suma_plata zaposleni. plata%TYPE; v_oid NUMBER NOT NULL : =

--Primjer select naredbe Outline DECLARE v_suma_plata zaposleni. plata%TYPE; v_oid NUMBER NOT NULL : = 10; BEGIN SELECT sum(plata) INTO v_suma_plata FROM zaposleni WHERE oid = v_oid; . . . END; PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 26

27 PL/SQL Naredbe • Strukutura IF naredbe IF logicki_uslov THEN lista_naredbi; [ELSIF logicki_uslov THEN

27 PL/SQL Naredbe • Strukutura IF naredbe IF logicki_uslov THEN lista_naredbi; [ELSIF logicki_uslov THEN lista_naredbi; ] … 2002 Prentice Hall. All rights reserved.

--Primjer if naredbe Outline IF v_ime = 'tehnika' THEN v_id : = 10; END_IF;

--Primjer if naredbe Outline IF v_ime = 'tehnika' THEN v_id : = 10; END_IF; PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 28

--Primjer elsif naredbe IF v_start > 200 THEN v_iznos : = v_iznos * 2;

--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 THEN v_iznos : = v_iznos * 4; END_IF; Outline PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 29

30 PL/SQL Naredbe • Opsta struktura petlji LOOP lista_naredbi; EXIT [WHEN uslov]; END LOOP

30 PL/SQL Naredbe • Opsta struktura petlji LOOP lista_naredbi; EXIT [WHEN uslov]; END LOOP 2002 Prentice Hall. All rights reserved.

31 PL/SQL Naredbe • For i WHILE sintaksa FOR broja in [REVERSE] donja. .

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; 2002 Prentice Hall. All rights reserved.

--Primjer FOR naredbe Outline BEGIN FOR brojac in 3. . 9 LOOP DBMS_OUTPUT. put_line('i:

--Primjer FOR naredbe Outline BEGIN FOR brojac in 3. . 9 LOOP DBMS_OUTPUT. put_line('i: ' || brojac); END LOOP; END; PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 32

--Primjer while naredbe Outline brojac NUMBER : =3; BEGIN WHILE brojac < 10 LOOP

--Primjer while naredbe Outline brojac NUMBER : =3; BEGIN WHILE brojac < 10 LOOP DBMS_OUTPUT. put_line('i: ' || brojac); brojac: =brojac +1; END LOOP; END; PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 33

--Primjer ugnježdenih petlji Outline o_counter NUMBER : = 1; i_counter NUMBER : = 1;

--Primjer ugnježdenih petlji Outline 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; PL/SQL Naredbe END LOOP outer_loop; END; i: 2 j: 2 i: 3 j: 2 2002 Prentice Hall. All rights reserved. 34

35 Upotreba promjenljivih tipa zapisa • Sintaksa: TYPE ime_tipa IS RECORD (deklaracija_polja (, deklaracija_polja)*);

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) 2002 Prentice Hall. All rights reserved.

--Primjer deklaracije zapisa Outline TYPE odjeljenje_rec_type 1 IS RECORD( o_id NUMBER, naziv varchar 2(20)

--Primjer deklaracije zapisa Outline TYPE odjeljenje_rec_type 1 IS RECORD( o_id NUMBER, naziv varchar 2(20) ); odjeljenje_rec 1 odjeljenje_rec_type; TYPE odjeljenje_rec_type 2 IS RECORD( o_id odjeljenje. o_id%TYPE, naziv varchar 2(20) ); PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 36

37 Upotreba promjenljivih tipa zapisa • Jednostavniji način deklaracije varijable tipa zapisa: odjeljenje_rec odjeljenje%ROWTYPE;

37 Upotreba promjenljivih tipa zapisa • Jednostavniji način deklaracije varijable tipa zapisa: odjeljenje_rec odjeljenje%ROWTYPE; 2002 Prentice Hall. All rights reserved.

--Upotreba zapisa Outline TYPE odjeljenje_rec_type IS RECORD( o_id NUMBER, naziv varchar 2(20) ); odjeljenje_rec

--Upotreba zapisa Outline TYPE odjeljenje_rec_type IS RECORD( o_id NUMBER, naziv varchar 2(20) ); odjeljenje_rec 1 odjeljenje_rec_type; odjeljenje_rec 2 odjeljenje%ROWTYPE; BEGIN --Ovo je komentar select * into odjeljenje_rec 1 from odjeljenje where o_id PL/SQL Naredbe = 1; select * into odjeljenje_rec 2 from odjeljenje where o_id = 2; dbms_output. put_line('ime prvog odjeljenja je : ' || odjeljenje_rec 1. naziv); dbms_output. put_line('ime drugog odjeljenja je : ' || odjeljenje_rec 2. naziv); END; / 2002 Prentice Hall. All rights reserved. 38

39 Eksplicitni kursori • Manipulacija eksplicitnim kursorima 2002 Prentice Hall. All rights reserved.

39 Eksplicitni kursori • Manipulacija eksplicitnim kursorima 2002 Prentice Hall. All rights reserved.

40 Eksplicitni kursori • Čitanje podataka putem kursora 2002 Prentice Hall. All rights reserved.

40 Eksplicitni kursori • Čitanje podataka putem kursora 2002 Prentice Hall. All rights reserved.

41 Eksplicitni kursori • Deklaracija kursora CURSOR ime IS SELECT naredba • Ne upotrebljava

41 Eksplicitni kursori • Deklaracija kursora CURSOR ime IS SELECT naredba • Ne upotrebljava se ključna riječ into 2002 Prentice Hall. All rights reserved.

--Upotreba kursora Outline CURSOR zap_cursor IS SELECT * FROM zaposleni; PL/SQL Naredbe 2002 Prentice

--Upotreba kursora Outline CURSOR zap_cursor IS SELECT * FROM zaposleni; PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 42

43 Rad sa kursorom • Otvaranje OPEN ime_kursora • Pristupanje zapisima u kursoru FETCH

43 Rad sa kursorom • Otvaranje OPEN ime_kursora • Pristupanje zapisima u kursoru FETCH ime_kursora INTO var, var. . . | zapis • Zatvaranje kursora CLOSE ime_kursora 2002 Prentice Hall. All rights reserved.

44 Ekplicitni kursori • Putem atributa kursora moze se doći do informacija li je

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 2002 Prentice Hall. All rights reserved.

--Upotreba ekplicitnih kursora Outline CURSOR zap_cursor IS SELECT * FROM zaposleni; zap_rec zaposleni%ROWTYPE; BEGIN

--Upotreba ekplicitnih kursora Outline CURSOR zap_cursor IS SELECT * FROM zaposleni; zap_rec zaposleni%ROWTYPE; BEGIN IF zap_cursor%ISOPEN THEN dbms_output. put_line('Kursor je otvoren '); ELSE dbms_output. put_line('Kursor je zatvoren '); END IF; OPEN zap_cursor; IF zap_cursor%ISOPEN THEN dbms_output. put_line('Kursor je otvoren '); ELSE dbms_output. put_line('Kursor je zatvoren '); END IF; PL/SQL Naredbe 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; / 2002 Prentice Hall. All rights reserved. 45

46 Kursor i FOR naredba • Sintaksa FOR ime_zapisa IN ime_kursora statement_list; END LOOP;

46 Kursor i FOR naredba • Sintaksa FOR ime_zapisa IN ime_kursora statement_list; END LOOP; 2002 Prentice Hall. All rights reserved.

--Upotreba ekplicitnih kursora Outline CREATE OR REPLACE PROCEDURE Stampaj. Zaposlene 2 IS CURSOR zap_cursor

--Upotreba ekplicitnih kursora Outline CREATE OR REPLACE PROCEDURE Stampaj. Zaposlene 2 IS CURSOR zap_cursor IS SELECT * FROM zaposleni; BEGIN PL/SQL Naredbe FOR zap_rec IN zap_cursor LOOP dbms_output. put_line('Zaposleni' || zap_cursor%ROWCOUNT || '. ' || zap_rec. ime || ' ' || zap_rec. jmbg); END LOOP; END; / 2002 Prentice Hall. All rights reserved. 47

--Upotreba ekplicitnih kursora Outline temp NUMBER DEFAULT 1; BEGIN FOR zap_rec IN (SELECT *

--Upotreba ekplicitnih kursora Outline temp NUMBER DEFAULT 1; BEGIN FOR zap_rec IN (SELECT * FROM zaposleni) LOOP dbms_output. put_line('Zaposleni ' || temp || '. ' || zap_rec. ime || ' ' || zap_rec. jmbg); temp : = temp + 1; END LOOP; PL/SQL Naredbe END; / 2002 Prentice Hall. All rights reserved. 48

49 Kursori sa parametrima • Moguće je definisati i parametrizovane kursore • Sintaksa CURSOR

49 Kursori sa parametrima • Moguće je definisati i parametrizovane kursore • Sintaksa CURSOR ime (ime parametra tip_parametra, . . . ) IS SELECT naredba 2002 Prentice Hall. All rights reserved.

--Upotreba ekplicitnih kursora Outline CURSOR zap_cursor (v_oid NUMBER) IS SELECT * FROM zaposleni where

--Upotreba ekplicitnih kursora Outline CURSOR zap_cursor (v_oid NUMBER) IS SELECT * FROM zaposleni where o_id = v_oid; zap_rec zaposleni%ROWTYPE; BEGIN OPEN zap_cursor(&v_id); LOOP PL/SQL Naredbe 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; / 2002 Prentice Hall. All rights reserved. 50

51 Procedure • Imenovani PL/SQL blokovi naredbi • Sintaksa za kreiranje procedura CREATE [OR

51 Procedure • Imenovani PL/SQL blokovi naredbi • Sintaksa za kreiranje procedura CREATE [OR REPLACE] PROCEDURE ime_procedure (ime_parametra [par_mod] tip_podatka, … ) IS PL/SQL naredbe END ime_procedure; 2002 Prentice Hall. All rights reserved.

52 Parametri poziva procedure • Parametar definiše vrijednost koja će biti predata proceduri pri

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 2002 Prentice Hall. All rights reserved.

Modeli predaje parametara prilikom poziva procedure • IN parametri – – – Ovo je

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 2002 Prentice Hall. All rights reserved. 53

Modeli predaje parametara prilikom poziva procedure • OUT parametri – Moraju biti inicijalizovani –

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 2002 Prentice Hall. All rights reserved. 54

--Procedura koja uvećava platu zaposlenim create or replace procedure uvecaj_platu (p_id in zaposleni. z_id%TYPE)

--Procedura koja uvećava platu zaposlenim create or replace procedure uvecaj_platu (p_id in zaposleni. z_id%TYPE) as begin update zaposleni set plata = plata + 0. 1 * plata where z_id = p_id; end uvecaj_platu; / Outline PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 55

--za zadato p_oid vraca naziv odjeljenja u promjenljivu p_ime create or replace procedure ime_odjeljenja

--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 begin select naziv into p_ime from odjeljenje where o_id = p_oid; end; / Outline PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 56

--Procedura koja vrsi formatiranje datuma Outline create or replace procedure formatiraj_datum (p_datum IN OUT

--Procedura koja vrsi formatiranje datuma Outline create or replace procedure formatiraj_datum (p_datum IN OUT varchar 2) as begin p_datum : = SUBSTR(p_datum, 1, 2) || '-' || SUBSTR(p_datum, 4, 2) || '-' || SUBSTR(p_datum, 7, 4); end; / PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 57

58 Procedure • Moguće je vršiti proizvoljno ugnježdavanje procedura, tj. moguće je pozvati jednu

58 Procedure • Moguće je vršiti proizvoljno ugnježdavanje procedura, tj. moguće je pozvati jednu proceduru iz tijela druge. 2002 Prentice Hall. All rights reserved.

--Procedura koja uvećava platu zaposlenim Outline CREATE OR REPLACE PROCEDURE uvecaj_platu_svima (p_oid IN odjeljenje.

--Procedura koja uvećava platu zaposlenim Outline 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; BEGIN OPEN 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; / PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 59

60 Kreiranje sekvence • Primjer: CREATE SEQUENCE odj_seq; • Inkrementiranje vrijednosit sekvence SELECT odj_seq.

60 Kreiranje sekvence • Primjer: CREATE SEQUENCE odj_seq; • Inkrementiranje vrijednosit sekvence SELECT odj_seq. NEXTVAL FROM SYS. DUAL 2002 Prentice Hall. All rights reserved.

--Procedura za unos novog odjeljenja create or replace procedure unesi_odjeljenje (p_oid in odjeljenje. naziv%TYPE)

--Procedura za unos novog odjeljenja create or replace procedure unesi_odjeljenje (p_oid in odjeljenje. naziv%TYPE) as begin insert into odjeljenje values(odj_seq. nextval, p_oid); end; / Outline PL/SQL Naredbe 2002 Prentice Hall. All rights reserved. 61

62 Funkcije • Kreiranje funkcija • Sintaksa CREATE [OR REPLACE] FUNCTION ime_funkcije (ime_parametra [par_mod]

62 Funkcije • Kreiranje funkcija • Sintaksa CREATE [OR REPLACE] FUNCTION ime_funkcije (ime_parametra [par_mod] tip_podatka, … ) RETURN tip_podatka IS PL/SQL naredbe END ime_funkcije; 2002 Prentice Hall. All rights reserved.

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

63 Funkcije • Parametri se definišu i predaju isto kao kod procedura • Razlika je u tome što funkcija vraća vrijednost 2002 Prentice Hall. All rights reserved.

--Funkcija koja vraća prosječnu platu Outline create or replace function prosjecna_plata (p_oid in odjeljenje.

--Funkcija koja vraća prosječnu platu Outline create or replace function prosjecna_plata (p_oid in odjeljenje. o_id%TYPE) return number is prosjek number; begin select avg(plata) into prosjek from zaposleni where o_id = p_oid; PL/SQL Naredbe return prosjek; end; / 2002 Prentice Hall. All rights reserved. 64

65 Funkcije • Ograničenja poziva funkcija koje su dio neke SQL naredbe – –

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 2002 Prentice Hall. All rights reserved.

66 Upravljanje potprogramima • Dodjeljivanje privilegija CREATE ALTER DROP EXECUTE (ANY) PROCEDURE • Primjer

66 Upravljanje potprogramima • Dodjeljivanje privilegija CREATE ALTER DROP EXECUTE (ANY) PROCEDURE • Primjer GRANT EXECUTE ON uvecaj_platu TO STUDENT 2002 Prentice Hall. All rights reserved.

67 Upravljanje potprogramima • Spisak funkcija i procedura, itd. nalazi se u metatabeli koja

67 Upravljanje potprogramima • Spisak funkcija i procedura, itd. nalazi se u metatabeli koja se naziva USER_OBJECTS – OBJECT NAME • Ime objekta – OBJECT_ID • Interni identifikator objekta – OBJECT_TYPE • Tip objekta, npr. TABLE, PROCEDURE itd. 2002 Prentice Hall. All rights reserved.

68 Upravljanje potprogramima • Izlistavanje svih procedura i funkcija SELECT object_name, object_type FROM user_objects

68 Upravljanje potprogramima • Izlistavanje svih procedura i funkcija SELECT object_name, object_type FROM user_objects WHERE object_type IN ('PROCEDURE', 'FUNCTION'); 2002 Prentice Hall. All rights reserved.

69 Upravljanje potprogramima • Izvorni kod procedura i funkcija čuva se u metatabeli USER_SOURCE

69 Upravljanje potprogramima • Izvorni kod procedura i funkcija čuva se u metatabeli USER_SOURCE – NAME • Ime objekta – TYPE • Tip objekta, npr. FUNCTION – LINE • Linija – TEXT 2002 Prentice Hall. All rights reserved.

70 Upravljanje potprogramima • Dobijanje informacija o izvornom kodu neke procedure SELECT text FROM

70 Upravljanje potprogramima • Dobijanje informacija o izvornom kodu neke procedure SELECT text FROM user_source WHERE name = 'uvecaj_platu' 2002 Prentice Hall. All rights reserved.

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

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 2002 Prentice Hall. All rights reserved.

72 Upravljanje potprogramima • Dobijanje informacija eventualnim greškama SELECT line, text FROM user_errors WHERE

72 Upravljanje potprogramima • Dobijanje informacija eventualnim greškama SELECT line, text FROM user_errors WHERE name = 'uvecaj_platu' SHOW ERRORS PROCEDURE uvecaj_platu 2002 Prentice Hall. All rights reserved.

73 Upravljanje potprogramima • Uništavanje procedura i funkcija DROP PROCEDURE 'uvecaj_platu' 2002 Prentice Hall.

73 Upravljanje potprogramima • Uništavanje procedura i funkcija DROP PROCEDURE 'uvecaj_platu' 2002 Prentice Hall. All rights reserved.

--Dodjeljivanje privilegija declare l_plsql_body varchar 2(1000) ; begin if '&CONNECT' in ('Y', 'y') then

--Dodjeljivanje privilegija declare l_plsql_body varchar 2(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; / Outline PL/SQL Naredbe >select granted_role from user_role_privs; 2002 Prentice Hall. All rights reserved. 74