HELIA 1 (17) Luento 2.8 Talletetut rutiinit... 2 Talletetut rutiinit SQL3:ssa... 3 Ulkopuoliset rutiinit... 4 Talletetut rutiinit Oraclessa... 7 Ohjelmakoodista... 8 Koodin virheet... 8 Virhetilanteiden käsittely ohjelmassa... 9 Riippuvuudet... 10 Proseduurit... 11 Funktiot... 12 Paketit / Packages... 13 PL/SQL:stä... 14
HELIA 2 (17) Talletetut rutiinit Tietokantaan tallennettu ohjelmamoduuli 1. Modulaarisempi ohjelmointi Yhteiskäyttöiset ohjelmamoduulit esim. herätetoiminnoissa Transaktion kapselointi 2. Abstraktien (käyttäjän määrittelemien) tietotyyppien metodien määrittely Ä olio-ohjelmointi Ä Ei SQL-92:ssa Å Toteutukset erilaisia eri tiedonhallintajärjestelmissä Ä Mukana SQL 3:ssa (Persistent Stored Modules / SQL/PSM) 1. Rakenteet joiden avulla tietokantaan voidaan tallentaa käännettyjä ja optimoituja ohjelmamoduuleita 2. Ohjelmointikieli, jolla moduulit tehdään 3. Käytäntö, jolla moduuleita kutsutaan Proseduurit ja funktiot Ä funktio palauttaa arvon, proseduuri ei itsenäinen kutsutaan eksplisiittisesti (suoraan) vaati suoritusoikeuden myönnön (Oraclessa)
HELIA 3 (17) Talletetut rutiinit SQL3:ssa { CREATE PROCEDIRE CREATE FUNCTION } <Routine_name> ( [ <Parameter_list>] ) [ RETURNS <data_type> [ <result cast> ] [ LANGUAGE {ADA C COBOL FORTRAN MUMPS PASCAL PLI SQL} ] [ DETERMINISTIC NOT DETERMINISTIC ] [ NO SQL CONTAINS SQL READS SQL DATA MODIFIES SQL DATA ] [ RETURN NULL ON NULL INPUT CALL ON NULL INPUT ] [ DYNAMIC RESULT SETS <unsigned_integer> <routine_body> Huomioita eheyssäänöistä kutsuttavien rutiinien on oltava deterministisiä palauttavat tietyillä parametreillä aina saman tuloksen Jos funktio tai proseduuri voi samoilla parametreillä kutsuttaessa palauttaa eri tuloksia eri ajankohtina, se ei ole deterministinen Null-arvojen käsittely rutiinissa Kursorien määrä proseduurissa
HELIA 4 (17) Esim. CREATE PROCEDURE Reset_table_1 () UPDATE table_1 SET column_1 = 0; CALL Reset_table_1 CREATE FUNCTION Pii () RETURNS DECIMAL(3,2) RETURN 3,14; INSERT INTO table_1 (decimal_column) VALUES (Pii()); Vakion määrittely SQL:ssä Ulkopuoliset rutiinit CREATE PROCEDURE Routine_1 () LANGUAGE C NO SQL EXTERNAL NAME c_rutiini_1 ;
HELIA 5 (17) CREATE PROCEDURE otto ( p_maara DECIMAL(6,2), p_hlo_id INTEGER, p_tili_id INTEGER ) CONTAINS SQL BEGIN UPDATE tili SET arvo = arvo p_maara WHERE tili_id = p_tili_id; UPDATE hlo SET kassa = kassa p_maara WHERE hlo_id = p_hlo_id; INSERT INTO tapahtuma VALUES ( p_tili_id, otto, p_maara, p_hlo_id, sysdate ); END;
HELIA 6 (17) ALTER { PROCEDURE FUNCTION ROUTINE METHOD } < Routine_name > {NAME LANGUAGE <null_clause> DYNAMIC RESULT SETS <unsigned_integer> } { RESTRICT CASCADE } ALTER PROCEDURE Routine_1 NAME Routine_2 RESTRICT; ei suositella käytettäväksi, jos jokin toinen objekti käyttää ko. rutiinia... DROP {PROCEDURE FUNCTION ROUTINE METHOD } <Routine_name> {RESTRICT CASCADE } DROP PROCEDURE Routine_2 RESTRICT;
HELIA 7 (17) Talletetut rutiinit Oraclessa Ä Sekä lähdekoodi että käännetty ohjelma tallennetaan tietohakemistoon: 1. Objektin nimi 2. Lähdekoodi 3. Parsinta 4. Pseudo-koodi 5. Riippuvuustiedot Ä Rutiinin nimen on oltava ainutkertainen ko. schemassa Å DESCRIBE <object_name> Å DESC <object_name> + Kyselyt tietohakemistotauluihin (palataan jatkossa) esim.... Ä Tietokantatoimenpiteet suoritetaan omistajan oikeuksilla ts. ao. tauluihin ei välttämättä tarvitse antaa oikeuksia Ä Suoritusoikeus proseduuriin / funktioon myönnettävä GRANT EXECUTE ON <object_name> TO <user_name>
HELIA 8 (17) Ohjelmakoodista Sallitut elementit: 1. DML-komennot 2. PL/SQL lauseet 3. Proseduuri- ja funktiokutsut (myös itsensä kutsuminen) Ä Mikäli kutsutaan triggeristä, transaktiolauseita ei saa olla (COMMIT, ROLLBACK) Ä Proseduurissa määritellyt muuttujat ja vakiot olemassa vain proseduurin suorituksen ajan Ä tee tekstinkäsittelyohjelmalla (Procedure Builderillä) (editointi helpompaa) Koodin virheet Ä SHOW ERRORS -komento + + tietohakemistotaulut (palataan jatkossa) esim....
HELIA 9 (17) Virhetilanteiden käsittely ohjelmassa RAISE_APPLICATION_ERROR (error_number, message text ) 1. Keskeyttää aliohjelman suorituksen 2. Peruuttaa aliohjelman suorittamat toimenpiteet 3. Palauttaa määritellyn virhenumeron ja viestin Ä Virhenumerot 20000-20999 on varattu käyttäjän (=suunnittelijan) määrittelemille virheille Ä RDBMS ei tarkista virhenumeroiden ainutkertaisuutta
HELIA 10 (17) Riippuvuudet 1. Objektit, joihin koodissa viitataan (proseduurit, funktiot, paketit, taulut, näkymät, synonyymit, sekvenssit) 2. Objektit, joista em. objektit ovat riippuvaisia Ä Oracle tarkistaa riippuvuudet automaattisesti Å Riippuvat objektit on käännetään uudelleen, mikäli viitattu kohde muuttuu Ä Käännös tapahtuu automaattisesti ajonaikana Ä Tarvittaessa koodia korjattava ja käännettävä manuaalisesti Kutsuttava proseduuri muuttuu esim. parametrilista muuttuu Käsiteltävä taulu muuttuu esim. käsiteltävä kenttä poistetaan ALTER PROCEDURE <object_name> COMPILE; ALTER FUNCTION <object_name> COMPILE; ALTER PACKAGE <object_name> COMPILE;
HELIA 11 (17) Proseduurit Oraclen syntaksi: CREATE PROCEDURE esimerkki kutsut CREATE OR REPLACE PROCEDURE ALTER PROCEDURE DROP PROCEDURE
HELIA 12 (17) Funktiot Oraclen syntaksi: CREATE FUNCTION esimerkki kutsut CREATE OR REPLACE FUNCTION ALTER FUNCTION DROP FUNCTION
HELIA 13 (17) Paketit / Packages Kokoaa yhteen aliohjelmia ja muuttujamäärittelyjä 1. Määrittelyosa (package specification Proseduurien ja funktioiden esittely Muuttujien ja vakioiden määrittely 2. Runko (package body) Proseduurien ja funktioiden määrittely Ä Paketissa määritellyt muuttujat ja vakiot olemassa koko käyttäjän istunnon ajan Oraclen syntaksi CREATE PACKAGE esimerkki CREATE OR REPLACE PACKAGE ALTER PACKAGE DROP PACKAGE
HELIA 14 (17) PL/SQL:stä Modulaarisuus [ DECLARE... ] BEGIN... [EXCEPTION...] END; Muuttujat Vakiot Kursorit SQL-työalue Ä Määritellään tyypillisesti kyselyille jotka palauttavat useamman kuin yhden rivin ja kutakin riviä halutaan käsitellä erikseen Tiedoston käsittely OPEN FETCH CLOSE Ä Kursori osoittaa käsiteltävän tietueen Kuva
HELIA 15 (17) Dynaamiset tietotyypit DECLARE This_tittle This_rec books.tittle%type; books%rowtype; CURSOR c1 IS SELECT tittle, author, publisher FROM books; Book_rec1%ROWTYPE;... OPEN c1 FETCH c1 INTO book_rec;...
HELIA 16 (17) Kontrollirakenteet IF TEHN ELSE END IF Toistorakenteet FOR... IN.x..y LOOP... END LOOP WHILE... LOOP... END LOOP LOOP... EXIT WHEN... END LOOP; Hyppy GOTO <label_name>... <<label_name>>...
HELIA 17 (17) Kapselointi Public / private määreet paketin tietorakenteille ja aliohjelmille Virheen käsittely