1) Jazyk PL/SQL PL/SQL je proceduralni jazyk (cykly, podminky, funkce, procedury). Zakladem je blok (nepojmenovany - anonymni, funkce, procedura). Bloky mohou byt vnorene. Struktura bloku: [DECLARE -- declarations] BEGIN -- statements [EXCEPTION -- handlers] END; Cast deklarace promennych a osetreni vyjimek je nepovinna. 2) Cast deklarace Promenne a konstanty musi byt deklarovany drive, nez jsou pouzity. Promenne a konstanty mohou mit libovolny SQL nebo PL/SQL datovy typ. Napr. jmeno VARCHAR2(20); ucitel BOOLEAN; Konstanty maji uvedeno klicove slovo CONSTANT a okamzite prirazenu hodnotu: pi CONSTANT real := 3.1415; Promenna muze byt naplnena 3 zpusoby: a) prirazovaci prikaz cena := pocet_hodin * sazba; ucitel := TRUE; b) klausule INTO prikazu select SELECT 1+1 INTO cena FROM dual; SELECT uco INTO cislo_osoby FROM lide WHERE rc=8254074667; c) vystupnim parametrem (OUT nebo IN OUT) procedury zvys_plat(plat,100); Atributy (pro zadavani datovych typu) Mame tabulku kniha a ta ma atribut nazev. Aniz bychom znali (nebo chteli presne specifikovat) datovy typ tohoto atributu, muzeme vytvorit promennou se stejnym datovym typem pomoci %TYPE. nazev_knihy kniha.nazev%TYPE Obdobne muzeme vytvorit promennou typu zaznam se vsemi atributy urcite tabulky (budeme do mi moci vlozit prave jeden radek tabulky). Slouzi k tomu %ROWTYPE. (funguje to i na kursory, ale o tom az priste). Napr.: Mejme tabulku lide s atributy jmeno, uco, rc: clovek lide%ROWTYPE Jednotlive polozky pak zpristupnime pomoci "." INSERT INTO seznam VALUES (clovek.uco); 3) Cast prikazu a) podminky IF-THEN-ELSE IF kredit >= 80 THEN insert into log values('Pripojeni GPRS povoleno',SYSDATE); povolit := TRUE; ELSE insert into log values('Prilis nizky kredit pro pripojeni GPRS',SYSDATE); povolit := FALSE; END IF; b) Nekonecny cyklus LOOP i := 100; LOOP i:=i+2; select salary into plat from employees where id=i; celkem := celkem + plat; EXIT WHEN j>1000; END LOOP; c) Cyklus FOR-LOOP FOR i IN 1..100 LOOP insert into mocniny values(i,i*i); END LOOP; d) Cyklus WHILE-LOOP WHILE salary <= 2500 LOOP select sal, mgr, ename into salary, mgr_num, last_name from emp where empno = mgr_num; END LOOP; e) Nepodmineny skok GOTO IF vykonnost > 90 THEN GOTO zvys_plat; END IF; IF prac_napln = 'Prodejce' THEN plat := plat * 1.2; ELSE plat := plat * 1.1; END IF; 4) Funkce a procedury [CREATE [OR REPLACE]] PROCEDURE jmeno_procedury (parametry) IS|AS blok ... [CREATE [OR REPLACE]] FUNCTION jmeno_funkce (parametry) RETURN datovy_typ IS|AS blok kde parametry jsou tvaru: jmeno_parametru [IN|OUT [NOCOPY]|IN OUT [NOCOPY]] datovy_typ [ {:=|DEFAULT} vyraz] IN - vstupni parametr (default) OUT - vystupni parametr IN OUT - vstupne/vystupni parametr Defaultne se IN parametr predava referenci a OUT a IN OUT hodnotou. Hint prekladace NOCOPY umozni i OUT a IN OUT parametry predavat referenci. DROP [PROCEDURE/FUNCTION] jmeno; 5) Vyjimky Pri vyvolani vyjimky je preruseno provadeni programu a je spusteno osetreni vyjimky. Existuje cela rada standardnich vyjimek (jako deleni nulou, chybejici data, timeout), krome toho je mozne vytvaret a osetrovat uzivatelsky definovane vyjimky. EXCEPTION WHEN vyjimky THEN ... WHEN VALUE_ERROR or ZERO_DIVIDE THEN ... WHEN OTHERS THEN ... Ne vsechny interni vyjimky jsou pojmenovane (jako napr. ZERO_DIVIDE), proto je muzeme osetrovat v casti OTHERS nebo pojmenovat: PRAGMA EXCEPTION_INIT(exception_name, Oracle_error_number); Napr: DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN ... EXCEPTION WHEN deadlock_detected THEN ... END; Manualni spusteni vyjimky: prikaz RAISE vyjimka; Manualni spusteni vyjimky a predani chybove zpravy (az 2048 znaku) aplikaci: raise_application_error(error_number, message[, {TRUE | FALSE}]); Pro ziskani chyb po vytvoreni procedury/funkce s chybami pouzijte prikaz show errors.