Úvod do pl/sql a storovaných procedúr · 2019-03-11 · sql nie je turing complete, nemá...
TRANSCRIPT
Úvod do PL/SQL a storovaných
procedúr
Jaroslav Porubän, Miroslav Biňas, Milan Nosáľ(c) 2015 - 2016
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
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
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
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
www.cde.sk
●Jednoriadkové-- toto je jednoriadkový komentár
●Viacriadkové/* Tento komentár je
na viacerých riadkoch */
Komentáre
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
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é
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
www.cde.sk
●Nemenná hodnotaconstant_name CONSTANT datatype := VALUE;●Deklarované v sekcii deklarácií●Príklad
posledny_rocnik CONSTANT number (1) := 4;
Konštanty
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
www.cde.sk
Podmienené výrazy
podmienka
podmienený kód
ak je podmienka splnená
ak podmienka splnená nie je
www.cde.sk
Podmienené výrazyIF conditionTHENstatement 1;ELSEstatement 2;END IF;
IF conditionTHENstatement 1;statement 2;ELSIF condition2THENstatement 3;ELSEstatement 4;END IF;
www.cde.sk
Iterácie
podmienka
podmienený kód
ak je podmienka splnená
ak podmienka splnená nie je
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;
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;/
www.cde.sk
While cyklus
●Slučka sa vykonáva kým platí podmienka
WHILE conditionLOOPstatements;END LOOP;
www.cde.sk
While cyklus - príkladDECLAREcislo number(1) := 1;BEGINWHILE cislo < 5LOOPdbms_output.put_line(cislo);cislo := cislo + 1;END LOOP;END;/
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;
www.cde.sk
For cyklus - príkladBEGINFOR counter in 1..5LOOPdbms_output.put_line(counter);END LOOP;END;/
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
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;/
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
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
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
www.cde.sk
CREATE OR REPLACE PROCEDURE greetingsASBEGIN dbms_output.put_line('Hello World!');END greetings;/
Procedúry - príklad
www.cde.sk
Spúštanie procedúr
●Príkazom EXECUTEEXECUTE greetings;●V PL/SQL bloku priamo menom procedúry
BEGINgreetings;
END;/
www.cde.sk
Mazanie procedúr
●Príkazom DROPDROP PROCEDURE procedure-name;●Príklad:
DROP PROCEDURE greetings;
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
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;/
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);
www.cde.sk
Funkcie
●Procedúry vracajúce hodnotu● Ich telo musí obsahovať RETURN●Môžu byť na pravej strane priradenia
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
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;/
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
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;
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;/
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
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
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;/
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
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;/
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
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
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
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
www.cde.sk
Otázky?