Úvod do pl/sql a storovaných procedúr · 2019-03-11 · sql nie je turing complete, nemá...

47
Úvod do PL/SQL a storovaných procedúr Jaroslav Porubän, Miroslav Biňas, Milan Nosáľ (c) 2015 - 2016

Upload: others

Post on 28-Mar-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

Úvod do PL/SQL a storovaných

procedúr

Jaroslav Porubän, Miroslav Biňas, Milan Nosáľ(c) 2015 - 2016

Page 2: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja

●PL/SQL umožňuje písať imperatívny kód○ riadiace konštrukcie cyklov, vetvenia,

atď.○ definovať a spúšťať programové

jednotky●Procedural Language extension of

Structured Query Language○ od Oracle, napr. Microsoft SQL Server

používa Transact-SQL

Úvod

Page 3: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Základné spustiteľné programové jednotky○ procedúry○ funkcie○ trigre○ natívne funkcie (napr. Java)

●Štrukturovanie je umožnené prostredníctvom balíkov

PL/SQL

Page 4: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●PL/SQL blok○ sekcia deklarácii○ sekcia vykonávania (povinná)○ sekcia výnimiek

●Príkazy sú ukončované bodkočiarkou ;DECLARE Variable declarationBEGIN Program Execution EXCEPTION Exception handlingEND;

PL/SQL blok

Page 5: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

BEGINdbms_output.put_line('Hello world!');

END;/

CREATE OR REPLACE FUNCTION helloRETURN varchar2 is

BEGIN return 'Hello world!';END hello;/

select hello() from dual;

Príklad

Page 6: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Jednoriadkové-- toto je jednoriadkový komentár

●Viacriadkové/* Tento komentár je

na viacerých riadkoch */

Komentáre

Page 7: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Premenné majú meno, typ a prípadne obmedzenie NOT NULL

variable_name [constant] datatype [NOT NULL] [:= | DEFAULT initial_value];●Výber typov

○ VARCHAR2, NVARCHAR2, CHAR, NCHAR ○ NUMBER(10,2), INTEGER, BINARY_INTEGER... ○ BOOLEAN○ …

●Referovaním typu○ var_name table.column%TYPE; ○ var_rec_name table.column%ROWTYPE;

Premenné – v časti DECLARE

Page 8: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Priradenie v DECLARE○ DEFAULT alebo :=

■ li_pocet INTEGER DEFAULT 0; ■ li_pocet INTEGER := 0;

○ pozor na výnimky●Priradenie hodnoty v tele

○ priame priradenievariable_name:= value;

○ priradenie výsledkov SELECT-uSELECT column_nameINTO variable_nameFROM table_name [WHERE condition];

Premenné

Page 9: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

DECLAREvar_birthday date;var_name varchar2(10) NOT NULL := 'Milan';

BEGINSELECT birthday INTO var_birthday FROM fbuser

WHERE name = var_name;dbms_output.put_line('User ' || var_name || ' has

birthday on ' || var_birthday);END;/

Premenné - príklad

Page 10: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Nemenná hodnotaconstant_name CONSTANT datatype := VALUE;●Deklarované v sekcii deklarácií●Príklad

posledny_rocnik CONSTANT number (1) := 4;

Konštanty

Page 11: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Pole rovnakých hodnôt s max. počtomTYPE type_name IS VARRAY(n) of <element_type>;●Príklad

DECLAREtype namesarray IS VARRAY(5) OF VARCHAR2(10);names namesarray;BEGINnames := namesarray('Milan', 'Jozef', 'Peter', 'Jakub', 'Jan');END;/

Polia

Page 12: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Podmienené výrazy

podmienka

podmienený kód

ak je podmienka splnená

ak podmienka splnená nie je

Page 13: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Podmienené výrazyIF conditionTHENstatement 1;ELSEstatement 2;END IF;

IF conditionTHENstatement 1;statement 2;ELSIF condition2THENstatement 3;ELSEstatement 4;END IF;

Page 14: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Iterácie

podmienka

podmienený kód

ak je podmienka splnená

ak podmienka splnená nie je

Page 15: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Jednoduchý cyklus

●Slučka sa vykoná aspoň raz●Príkaz EXIT ukončí vykonávanie slučky

LOOPstatements;EXIT; {or EXIT WHEN condition;}END LOOP;

Page 16: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Jednoduchý cyklus - príkladDECLAREcislo number(1) := 1;BEGINLOOPdbms_output.put_line(cislo);cislo := cislo + 1;EXIT WHEN cislo > 5;END LOOP;END;/

Page 17: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

While cyklus

●Slučka sa vykonáva kým platí podmienka

WHILE conditionLOOPstatements;END LOOP;

Page 18: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

While cyklus - príkladDECLAREcislo number(1) := 1;BEGINWHILE cislo < 5LOOPdbms_output.put_line(cislo);cislo := cislo + 1;END LOOP;END;/

Page 19: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

For cyklus

●Cyklus vhodný v prípadoch, keď poznáme dopredu počet opakovaní

●counter je deklarovaný implicitne a je inkrementovaný pri každom cykle o hodnotu 1

FOR counter IN val1..val2LOOPstatements;END LOOP;

Page 20: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

For cyklus - príkladBEGINFOR counter in 1..5LOOPdbms_output.put_line(counter);END LOOP;END;/

Page 21: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Návestia

●Návestia sú identifikované znakmi << a >>●Návestie môže definované byť pred cyklom

alebo pri ukončení cyklu●Kombinovať sa môže s

○ END - koniec daného cyklu○ EXIT - opustenie cyklu s uvedeným

návestím○ CONTINUE - pokračovanie v cykle s

návestím○ GOTO - prechod na daný cyklus

Page 22: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

NávestiaDECLAREi number(1);j number(1);BEGIN

<< outer_loop >>FOR i IN 1..3 LOOP

<< inner_loop >>FOR j IN 1..3 LOOP

dbms_output.put_line('i je: '|| i || ' and j je: ' || j);END loop inner_loop;

END loop outer_loop;END;/

Page 23: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Podprogram je pomenovaný blok, ktorý môže byť opakovane volaný a pritom preberať skutočné parametre○ štruktúra podprogramu je zhodná so

štruktúrou bloku○ podprogramy môžu byť dvoch typov:

■ procedúry■ Funkcie

○ viac procedúr a funkcií sa môže združovať do logických celkov – balíkov (package)

Podprogram

Page 24: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Procedúry zapísané v PL/SQL○ pomenovaný PL/SQL blok príkazov

vykonávajúci jednu alebo viac špecifických úloh

●Vykonávané databázovým serverom●Volané inými procedúrami, trigrami, alebo

priamo aplikáciami

Procedúry

Page 25: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [IN | OUT | IN OUT] type [, ...])]{IS | AS}

< sekcia deklaracii >BEGIN

< telo procedury (sekcia vykonavania) >[EXCEPTION]

< sekcia vynimiek >END [procedure_name];

Procedúry

Page 26: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

CREATE OR REPLACE PROCEDURE greetingsASBEGIN dbms_output.put_line('Hello World!');END greetings;/

Procedúry - príklad

Page 27: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Spúštanie procedúr

●Príkazom EXECUTEEXECUTE greetings;●V PL/SQL bloku priamo menom procedúry

BEGINgreetings;

END;/

Page 28: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Mazanie procedúr

●Príkazom DROPDROP PROCEDURE procedure-name;●Príklad:

DROP PROCEDURE greetings;

Page 29: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Parametre

●Tri módy parametrov○ IN - vstupný parameter, v rámci

procedúry sa správa ako konštanta, odovzdávaný referenciou

○ OUT - v rámci programu sa správa ako premenná, slúži na návrhat hodnoty volajúcemu programu, odovzdávaný hodnotou (skutočný parameter musí byť premenná)

○ IN OUT - kombinácia predchádzajúcich

Page 30: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Parametre - príkladDECLARE

a number;b number;c number;

PROCEDURE add(x IN number, y IN number, z OUT number)ISBEGIN

z:= x + y;END;BEGIN

a:= 23;b:= 45;add(a, b, c);dbms_output.put_line(' Sucet (23, 45) : ' || c);

END;/

Page 31: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Odovzdávanie parametrov

●Pozičná notácia○ dodržané poradieadd(a, b, c);

●Menná notácia○ identifikácia podľa mena parametrovadd(x=>a, y=>b, z=>c);

●Zmiešaná notácia○ pozičná má prednosť pred mennouadd(a, z=>b, y=>c);

Page 32: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Funkcie

●Procedúry vracajúce hodnotu● Ich telo musí obsahovať RETURN●Môžu byť na pravej strane priradenia

Page 33: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] type [, ...])]RETURN return_datatype{IS | AS}

< sekcia deklaracii >BEGIN

< telo funkcie (sekcia vykonavania) >[EXCEPTION]

< sekcia vynimiek >END [function_name];

Funkcie

Page 34: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Funkcie - príkladDECLARE

a number;b number;

FUNCTION add(x IN number, y IN number)RETURN numberIS

z number;BEGIN

z := x + y;RETURN z;

END;BEGIN

a:= 23;b:= 45;dbms_output.put_line(' Sucet (23, 45) : ' || add(a, b));

END;/

Page 35: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Technika spracovania výnimočných situácii pri vykonávaní PL/SQL programov

●Systémové výnimky○napr. LOGIN_DENIED

●Používateľské výnimkyDECLARE

my-exception EXCEPTION;

●Vyvolanie výnimkyRAISE my-exception;

Výnimky

Page 36: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Výnimky - syntaxDECLARE

<declarations section>BEGIN

<executable command(s)>EXCEPTION

WHEN exception1 THENexception1-handling-statements

WHEN exception2 THENexception2-handling-statements

........WHEN others THEN

default-exception-handling-statementsEND;

Page 37: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Výnimky - príkladDECLARE

s_meno student.meno%type;BEGIN

SELECT meno INTO s_meno FROM student WHERE id = 8;dbms_output.put_line ('Meno studenta: '|| s_meno );

EXCEPTIONWHEN no_data_found THEN

dbms_output.put_line('Takeho studenta niet!');WHEN others THEN

dbms_output.put_line('Chyba!');END;/

Page 38: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Špeciálny objekt PL/SQL pre prácu s viacerými záznamami vrátenými SELECT-om

●Kurzory ponúkaju viacero vstavaných (implicitných) atribútov na prácu s dopytmi○%FOUND - vráti TRUE ak SELECT našiel

nejaký záznam, resp. pri manipulačných dopytoch bol nejaký záznam vytvorený

○%NOTFOUND, %ISOPEN, %ROWCOUNT

Kurzory

Page 39: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Explicitný kurzor pre kontrolu nad konkrétnym dopytom

CURSOR cursor_name IS select_statement;●Štyri kroky pri práci s kurzormi

○deklarácia ○otvorenie (open) - alokácia pamäte a

príprava vykonania○načítanie (fetch) - prístup k jednému

záznamu z výskedku dopytu○zatvorenie (close) - uvoľnenie pamäte

Explicitné kurzory

Page 40: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Explicitné kurzory - príkladDECLARE s_id student.id%type; s_meno student.meno%type; CURSOR studenti is SELECT id, meno FROM student;BEGIN OPEN studenti; LOOP FETCH studenti into s_id, s_meno; EXIT WHEN studenti%notfound; dbms_output.put_line(s_id || ' ' || s_meno); END LOOP; CLOSE studenti;END;/

Page 41: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

● Implicitný kurzor sa automaticky vytvorí pri každom SQL dopyte ○ implicitný kurzor je automaticky priradený

do premennej sqlUPDATE employee SET salary = salary + 500;IF sql%notfound THEN …

○využiteľný vo for slučkeFOR ... IN ( SELECT ... ) LOOP

Implicitné kurzory

Page 42: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Implicitné kurzory - príkladBEGIN FOR cur_rec IN (select username from dba_users where profile='STUDENT_PROFILE') LOOP BEGIN EXECUTE IMMEDIATE 'DROP USER ' || cur_rec.username || ' CASCADE'; END; END LOOP;END;/

Page 43: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Dynamicky vytvorené SQL príkazy reprezentované ako reťazec○napr. keď dopredu nepoznáme názov

tabuľky○vykonávané príkazom EXECUTE

IMMEDIATE●Napr.:

EXECUTE IMMEDIATE 'DROP USER ' || cur_rec.username || ' CASCADE';

Dynamické SQL príkazy

Page 44: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Zložité štruktúrované údajové typy●Syntax:

TYPEtype_name IS RECORD( field_name1 datatype1 [NOT NULL] [:= DEFAULT EXPRESSION],field_name2 datatype2 [NOT NULL] [:= DEFAULT EXPRESSION],…field_nameN datatypeN [NOT NULL] [:= DEFAULT EXPRESSION);

record-name type_name;

Údajový typ záznamov

Page 45: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

DECLARETYPEosoba IS RECORD( meno varchar2(50), priezvisko varchar2(50));

novy_student osoba;BEGIN

novy_student.meno := 'Jozko';novy_student.priezvisko := 'Mrkvicka';

dbms_output.put_line('Meno studenta : ' || novy_student.meno);dbms_output.put_line('Priezvisko studenta : ' || novy_student.priezvisko);

END;/

Záznamy - príklad

Page 46: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

●Založené na tabuľkách a kurzoroch - zodpovedajú riadku

DECLAREstudent_rec student%rowtype;

BEGINSELECT * INTO student_recFROM student WHERE id = 5;...

END;

Záznamy založené na typoch riadkov

Page 47: Úvod do PL/SQL a storovaných procedúr · 2019-03-11 · SQL nie je Turing complete, nemá vyjadrovaciu silu Turingovho stroja PL/SQL umožňuje písať imperatívny kód riadiace

www.cde.sk

Otázky?