Funkcijos 9 paskaita.

Slides:



Advertisements
Similar presentations
2 Copyright © 2004, Oracle. All rights reserved. Creating Stored Functions.
Advertisements

Copyright  Oracle Corporation, All rights reserved. 4 Creating Functions.
Copyright © SUPINFO. All rights reserved Procedures and functions.
Lecture 4 PL/SQL language. PL/SQL – procedural SQL Allows combining procedural and SQL code PL/SQL code is compiled, including SQL commands PL/SQL code.
1 JumpStart PL/SQL Wang Hao. 2 Outline PL/SQL Programming SQL*Plus and SQL commands.
PL/SQL A BRIEF OVERVIEW DAVID WILSON. PL/SQL User’s Guide and Reference PL/SQL User’s Guide and Reference.
In Oracle.  A PL/SQL block stored in the database and fired in response to a specified event ◦ DML statements : insert, update, delete ◦ DDL statements.
Lecture 8 Creating Stored Functions. Objectives  After completing this lesson, you should be able to do the following:  What is Function?  Types of.
PL/SQL Procedural Language / Structured Query Language.
School of Computing and Management Sciences © Sheffield Hallam University SQL is non-procedural –designed to be relatively approachable to non- programmers.
Retrieving Data in PL/SQL. 2 home back first prev next last What Will I Learn? In this lesson, you will learn to: –Recognize the SQL statements that can.
Lietuvos vardo kilmė Žmogus, nepažįstantis savo tautos namų – Tėvynės žemės, kurioje nuo seno tėvai ir protėviai gyveno, - nėra savo krašto pilietis! Įsisąmoninkime.
Creating Functions. V 12 NE - Oracle 2006 Overview of Stored Functions A function is a named PL/SQL block that returns a value A function can be stored.
Using Functions in SQL Statements. 2 home back first prev next last What Will I Learn? List the advantages of user-defined functions in SQL statements.
Oracle9i Developer: PL/SQL Programming Chapter 5 Functions.
What Are Subprograms? Subprograms are named PL/SQL blocks that can take parameters and be invoked. Subprograms allow decomposition of a program into logical.
STORED PROCEDURE & STORED FUNCTION Politeknik Telkom 2012.
Vaizdinė užduotis. Kuriose iš šių valstybių galima pamatyti tokius gyvenamuosius namus? Jemene Tanzanijoje Mongolijoje Indonezijoje A B C D 1.
Network address translation Tinklo adresų vertimas
Creating Stored Functions
Interacting with the Oracle Server
Algoritmai ir duomenų struktūros (ADS)
Tekstų redaktorius MS Word 200x
Regresijos determinuotumas
Funkcijos R.
Programavimo ir IT pagrindai
Darbą parengė: Viktorija Drūteikaitė IT2
SSGG (SWOT): Organizacijos stiprybės ir silpnybės, galimybės ir grėsmės (nustatymas, grupavimas, vertinimas, rezultatas) Pagrindinė literatūra: Lietuvos.
MAUDYKLŲ VANDENS KOKYBĖS STEBĖSENOS
Robert Andruškevič AT27D.   Tai yra operacinė sistema, daugiausia naudojama išmaniuosiuose telefonuose, nors ją galima įdiegti ir kituose mobiliuosiuose.
Trigeriai 10 Paskaita.
Video kūrimas su Windows Movie Maker 2.0
Įvadas į dinaminių interneto puslapių kūrimą
Dialogo langai Benas Ragauskas, PS m.
Sintaksė ir semantika Identifikatoriai ir unikodas Komentarai
PHP „CodeIgniter“ karkaso saugumas
Pagrindinės sąvokos Hipertekstas ir multimedija
Lotus Notes pagrindai Notes darbalaukis.
Atliko: Jokūbas Rusakevičius VU MIF PS 3k 3g
Daiktavardis Dalykas, ugdymo sritis: Tema: Klasė: Priemonės paskirtis:
R paketas ir jo įdiegimas
JavaScript kalbos apžvalga
IPod MENIU.
Įvadas į Java programavimo kalbą
Gijos (Threads) Java kalboje
PRACTICE OVERVIEW PL/SQL Part - 2.
Paprasti skaičiavimai. Uždavinių sprendimas
Failai ir jų tvarkymas.
Funkcijų naudojimas.
Regresijos determinuotumas
Database Management Systems 2
Tekstiniai uždaviniai
Saulius Ragaišis, VU MIF
2 skyrius Procesai ir gijos 2.1 Ką vadiname procesu 2.2 Proceso būviai
Virtualus kompiuteris
Duomenų struktūros ir algoritmai
1. Learning from the first year of the project
Operacinė sistema Testas 9 klasė
Studijų pasirinkimas Lietuvoje ir užsienyje: ką svarbu žinoti?
Daugelio dokumentų sąsaja (angl. Multiple document interface)
Sąveika su Oracle Duomenų bazė
Windows Ribbon Framework
Kintamųjų deklaravimas PL/SQL
Klaipėdos Simono Dacho progimnazija
Klasių diagramos Paskaitos tikslas – supažindinti su klasių diagramos notacija ir jos ryšiu su programiniu kodu.
Grupinio darbo programinė įranga Lotus Notes
Pranešėjas Jurij Kuznecov
Presentation transcript:

Funkcijos 9 paskaita

Funkcijos - Turinys Kas yra PLSQL funkcija? Funkcijų struktūra Funkcijos kūrimo sintaksė Paprogramių parametrai Funkcijos vykdymas Funkcijos šalinimas RETURN sakinio naudojimas Apribojimai PL/SQL paprogramių paketavimas Paprogramės parametrų būsenos Paprogramių vardų perkrovimas Perkrovimo apribojimai

2018.12.03 Kas yra PLSQL funkcija? Funkcija – tai paprogramė, kurios tikslas suskaičiuoti norimą reikšmę Funkcijų struktūra yra labai panaši į jau minėtų procedūrų, skirtumas tik tas, kad funkcijos turi papildomą RETURN sakinį F-ja gali būti saugoma duomenų bazėje kaip schemos objektas, kurį galima daug kartų vykdyti F-ja iškviečiama kaip išraiškos dalis F-ja – vardą turintis PL/SQL blokas, kuris gali priimti parametrus ir g.b. iškviestas. F-jos naudojamos reikšmės suskaičiavimui. F-jos ir procedūros turi tokią pačią struktūrą. F-ja turi grąžinti reikšmę kviečiančiai aplinkai, tuo tarpu kai procedūra grąžina nulį arba daug reikšmių į kviečiančią aplinką. Kaip ir procedūra, f-ja turi antraštę (header), deklaravimo ir vykdymo dalis, bei neprivalomą išimčių apdorojimo (exception) dalį. F-ja privalo turėti RETURN dalį antraštėje ir bent vieną RETURN sakinį vykdomojoje sekcijoje. F-jos g.b. saugomos duomenų bazėje kaip schemos objektas, kurį galima daug kartų vykdyti. F-ja g.b. sukurta ir vartotojo aplikacijoje. F-jos, saugomos duomenų bazėje g.b. lengvai palaikomos ir daug kartų naudojamos bet kokiame kiekyje klientinių aplikacijų. F-ja yra iškviečiama kaip išraiškos dalis arba kaip PL/SQL išraiškos dalis: SQL išraiškoje f-jos turi būti naudojamos laikantis taisyklių, norint nesukelti pašalinių efektų (funkcijos, naudojamos SELECT sakinyje, negali atlikti INSERT, UPDATE ar DELETE veiksmų, nes SELECT nekeičia duomenų bazės, o tik išrenka duomenis (PRAGMA wnds ir kt.) ). PL/SQL išraiškoje, f-jos vardas elgiasi kaip kintamasis, kurio reikšmė priklauso nuo perduotų parametrų.

} Funkcijų kūrimas Redaktorius (rašomas CREATE(OR REPLACE) FUNCTION) 2018.12.03 Funkcijų kūrimas Redaktorius (rašomas CREATE(OR REPLACE) FUNCTION) file.sql SQL*Plus (load ir execute file.sql) Oracle (kodas) kompiliavimas P kodas (sukuriama funkcija) Vykdymas } Galima naudoti SHOW_ERRORS Kompiliavimo klaidų peržiūrai Funkcijos kūrimo etapai: Rašoma sintaksė: kuriamas funkcijos kodas (CREATE FUNCTION sakinys) sisteminiame arba tekstiniame redaktoriuje ir išsaugomas SQL failo pavidalu (praplėtimas .sql). Kodas kompiliuojamas: naudojant SQL*Plus, paleidžiamas SQL failas. Kodas sukompiliuojamas į P kodą ir sukuriama funkcija. Failas su CREATE FUNCTION (arba CREATE OR REPLACE FUNCTION) sakiniu leidžia pakeisti sakinį jei yra kompiliavimo arba programos vykdymo (run-time) klaidų arba atlikti vėlesnius pakeitimus faile. Negalima naudoti funkcijų su klaidomis. SQL*Plus-e naudojamas SHOW_ERRORS kompiliavimo klaidų rodymui. Funkcijos vykdymas. Funkcija gali būti kiek norima kartų vykdoma naudojant EXECUTE komandą SQL*Plus’e. F-ją galima iškviesti iš PL/SQL bloko. Pridedamas RETURN sakinys su grąžinamos reikšmės duomenų tipu funkcijos antraštėje. Vykdomojoje sekcijoje pridedamas 1 sakinys su RETURN. Galima nurodyti keletą RETURN sakinių funkcijoje (paprastai su IF sakiniais). Tik 1 RETURN sakinys vykdomas, nes po reikšmės grąžinimo, PL/SQL bloko vykdymas nutraukiamas. Pastaba: jei yra kompiliavimo klaidų ir norima atlikti pakeitimus su sakiniu CREATE FUNCTION, reikia arba procedūrą ištrinti (DROP) arba naudoti OR REPLACE.

Funkcijos kūrimo sintaksė 2018.12.03 Funkcijos kūrimo sintaksė [CREATE [OR REPLACE ] ] FUNCTION function_name [ ( parameter [mode] datatype [ , parameter ]... )] RETURN datatype [ AUTHID { DEFINER | CURRENT_USER } ] [ PARALLEL_ENABLE [ { [CLUSTER parameter BY (column_name [,column_name ]...) ] | [ORDER parameter BY (column_name [,column_name ]...) ] } ] [ ( PARTITION parameter BY { [ {RANGE | HASH } (column_name [, column_name]...)] | ANY } ) ] ] [DETERMINISTIC] [ PIPELINED [ USING implementation_type ] ] [ AGGREGATE [UPDATE VALUE] [WITH EXTERNAL CONTEXT] USING implementation_type ] {IS | AS} [ PRAGMA AUTONOMOUS_TRANSACTION; ][ local declarations ] BEGIN executable statements RETURN!!!! [ EXCEPTION exception handlers ] END [ name ]; CREATE leidžia sukurti pavienes funkcijas, kurios patalpinamos į Oracle duomenų bazę. Tokią funkciją galima įvykdyti iš SQL*Plus arba iš programos naudojančios vietinį dinaminį SQL. function_name – f-jos vardas. parameter – PL/SQL kintamojo, perduodamo f-jai, vardas.. mode – parametro tipas (IN,OUT ar IN OUT) datatype – parametro duomenų tipas. RETURN datatype – grąžinamos reikšmės duomenų tipas turi būti f-jos rezultatas. RETURN – sakinyje neturi būti nurodytas duomenų tipo ilgis. Pastaba: PL/SQL blokas turi turėti bent 1 RETURN sakinį! AUTHID nustato ar sukurta funkcija vykdoma jos savininko privilegijomis (pagal nutylėjimą) arba esamo vartotojo ir ar šią procedūra gali iškviesti bet kuris vartotojas. Savininko privilegijas, kurios nustatomos pagal nutylėjimą galima pakeisti su CURRENT_USER. PARALLEL_ENABLE nustato, kad funkcija gali būti naudojama paraleliai. Kaip ir procedūros, funkcijos turi dvi dalis : specialiąją ir kūną. Specialioji dalis pradedama raktiniu žodžiu FUNCTION ir baigiama raktiniu žodžiu RETURN, kuris aprašo grąžinamos reikšmės tipą. RETURN Parametrų deklaravimas nėra privalomas. Funkcijos, kurios nereikalauja parametrų yra rašomos be skliaustelių. Funkcijos kūnas pradedamas žodeliais IS arba AS, o baigiamas žodeliu END, po kurio gali būti pavadinimas jei funkcija jį turi. Funkcijos kūnas turi tris dalis: deklaracinę, vykdomąją ir klaidų gaudymo (pastaroji yra neprivaloma). Deklaracinėje funkcijos kūno dalyje yra deklaruojami vietiniai (lokalūs) kintamieji. Jie turi būti rašomi tarp raktinių žodžių IS ir BEGIN. Deklaruojant raktinis žodis DECLARE nėra naudojamas. Vykdomoji kūno dalis yra talpinama tarp raktinių žodžių BEGIN ir EXCEPTION (arba END jei klaidų gaudymo dalies funkcija neturi). Bent vienas ar keli RETURN sakiniai turi būti rašomi būtent vykdomojoje funkcijos kūno dalyje. Jei reikia, klaidų gaudymo dalis yra rašoma tarp raktinių žodžių: EXCEPTION ir END. Joje yra gaudomos vykdymo metu galinčios atsirasti klaidos.

DB funkcijos kūrimas SQL*Plus’e 2018.12.03 DB funkcijos kūrimas SQL*Plus’e CREATE OR REPLACE FUNCTION get_sal (p_id IN employees.employee_id%TYPE) RETURN NUMBER IS v_salary employees.salary%TYPE:=0; BEGIN SELECT salary INTO v_salary FROM employees WHERE employee_id=p_id; RETURN v_salary; END get_sal; Sukurta f-ja su vienu IN parametru ir grąžina NUMBER reikšmę. F-ją SQL*Plus’e galima iškviesti kaip PL/SQL išraiškos dalį. Geras programavimo stilius yra priskirti f-jos grąžinamą reikšmę kintamajam ir naudoti vienintelį RETURN sakinį vykdomojoje sekcijoje. RETURN sakinys g.b. Ir EXCEPTION dalyje.

Funkcijos - pavyzdys 1 FUNCTION sal_ok (salary REAL, title VARCHAR2) 2018.12.03 Funkcijos - pavyzdys 1 FUNCTION sal_ok (salary REAL, title VARCHAR2) RETURN BOOLEAN IS min_sal REAL; max_sal REAL; BEGIN SELECT losal, hisal INTO min_sal, max_sal FROM sals WHERE job = title; RETURN (salary >= min_sal) AND (salary <= max_sal); END sal_ok; Iškvietimo metu funkcija reikalauja dviejų dydžių – darbuotojo atlyginimo ir darbo pavadinimo. Darbo pavadinimas reikalingas to darbo didžiausios ir mažiausios reikšmių suradimui iš lentelės „sals“, o atlyginimas naudojamas lyginimui. Funkcija gražina loginę reikšmę - taip arba ne. Jei funkcija kviečiama su kintamuoju „salary“, kurio reikšmė yra tarp min_sal ir max)sal – funkcija gražins reikšmę TRUE, jei ne – FALSE.

Funkcijos - pavyzdys 2 FUNCTION balance (acct_id INTEGER) RETURN REAL IS acct_bal REAL; BEGIN SELECT bal INTO acct_bal FROM accts WHERE acct_no = acct_id; RETURN acct_bal; END balance;

2018.12.03 Funkcijos - pavyzdys 3 FUNCTION compound (years NUMBER, amount NUMBER, rate NUMBER) RETURN NUMBER IS BEGIN RETURN amount * POWER((rate / 100) + 1, years); END compound; Antrajame pavyzdyje parodytas sudėtingas RETURN sakinys. Pastebėtina, kad funkcija turi turėti bent viena veiksmą, kuris gražina reikšmę vykdomojoje dalyje, priešingu atveju bus gaunama klaida: „function returned without value“.

Funkcijos vykdymas Iškviesti f-ją kaip PL/SQL išraiškos dalį 2018.12.03 Funkcijos vykdymas Iškviesti f-ją kaip PL/SQL išraiškos dalį Sukurti kintamąjį, kuris saugos grąžinamą reikšmę Vykdyti f-ją. Kintamajame bus patalpinta reikšmė grąžinama per RETURN sakinį F-ja gali priimti vieną ar kelis parametrus, tačiau turi grąžinti vienintelę reikšmę. F-js iškviečiama kaip PL/SQL išraiškos dalis, naudojant kintamuosius grąžinamos reikšmės saugojimui. 3 parametrų būsenos IN (pagal nutylėjimą), OUT ir IN OUT, gali būti naudojamos bet kokioje paprogramėje, tačiau reikia vengti naudoti OUT ir IN OUT būsenų f-jose. F-jos paskirtis yra priimti nulį arba daugiau parametrų ir grąžinti vienintelę reikšmę. Taip pat f-jos neturi sukelti pašalinių efektų, kurie gali keisti kintamųjų reikšmes, kurie nėra lokalūs parogramėje.

Paprogramių parametrai 2018.12.03 Paprogramių parametrai Formalūs – kintamieji, deklaruoti paprogramės specifikacijoje parametrų sąraše ir naudojami paprogramės kūne Tikrieji (faktiniai)- kintamieji arba išraiškos nurodyti paprogramės kvietimo parametrų sąraše

Funkcijos vykdymas IF sal_ok(new_sal, new_title) THEN ... 2018.12.03 Funkcijos vykdymas IF sal_ok(new_sal, new_title) THEN ... get_salary.sql failo vykdymas SQL*PLUS’e: VARIABLE g_salary NUMBER EXECUTE :g_salary:=get_sal(117) PRINT g_salary 1 2 Funkcija iškviečiama darbui panaudojus jos vardą ir teisingai surašius parametrus (parameters) t.y. kviečiančiojo sakinio ir funkcijos kintamųjų skaičius ir tipai privalo sutapti. Kintamieji “new_sal” ir ”new_title” prieš tai turi būti inicializuoti. 1.Sukuriami aplinkos kintamasis, kuris saugos RETURN (kintamasis) reikšmę. 2. F-ja iškviečiama su EXECUTE komanda SQL*Plus’e. F-jos rezultatas priskiriamas aplinkos kintamaja su “:” ženklu. 3. Rezultatas išvedamas su PRINT komanda. Jei f-jos kode nebus reikšmės grąžinimo, tai jos vykdymo metu bus atspausdintas kaidos pranešimas Function returned without value. 3

Vartotojų sukurtų f-jų privalumai SQL išraiškose 2018.12.03 Vartotojų sukurtų f-jų privalumai SQL išraiškose SQL praplėtimas, kai reikalingi skaičiavimai yra sudėtingi arba jų neįmanoma atlikti su SQL Padidina duomenų nepriklausomumą, kai sudėtinga duomenų analizė atliekama Oracle serveryje, o ne ištraukus visus duomenis ir skaičiuojant juos aplikacijoje Padidina užklausų efektyvumą, kai f-jos naudojamos užklausoje, o ne atliekamos aplikacijoje Galima manipuliuoti naujais duomenų tipais (ilguma/platuma) verčiant juos character eilutėmis ir atliekant operacijas su jais per f-jas SQL išraiškose galima naudoti vartotojo sukurtas PL/SQL f-jas. Vartotojo sukurtas f-jas galima naudoti visur kur galima naudoti vidines SQL f-jas.

F-jos iškvietimas SQL išraiškose - pavyzdys 2018.12.03 F-jos iškvietimas SQL išraiškose - pavyzdys CREATE OR REPLACE FUNCTION tax (p_value IN NUMBER) RETURN NUMBER IS BEGIN RETURN (v_salary * 0.08); END tax; / SELECT employee_id, last_name, salary, tax(salary) FROM employees WHERE department_id=100; Pavyzdyje sukuriama f-ja tax, kuri iškviečiama SELECT sakinyje. F-ja priima NUMBER parametrą ir grąžina reikšmę.

Sritys iš kurių g. b. kviečiama f-ja 2018.12.03 Sritys iš kurių g. b. kviečiama f-ja Reikšmių sąraše SELECT sakinyje Sąlygos sakiniuose WHERE ar HAVING CONNECT BY, START WITH, ORDER BY ir GROUP sakiniuose VALUES sakinys INSERT komandoje SET sakinys UPDATE komandoje Vartotojo sukurtos PL/SQL f-jos gali būti kviečiamos iš visų SQL išraiškų, kuriose g.b. kviečiamos Oracle vidinės f-jos. Pavyzdys: SELECT employee_id, tax(salary) FROM emploees WHERE tax(salary)>(SELECT MAX(tax(salary)) FROM emploees WHERE department_id=30) ORDER BY tax(salary) DESC;

Apribojimai kviečiant f-jas iš SQL išraiškų 2018.12.03 Apribojimai kviečiant f-jas iš SQL išraiškų Kad f-ją būtų galima kviesti iš SQL išraiškų ji turi būti: Saugoma duomenų bazėje Priimti tik IN parametrus Priimti tik galiojančius SQL duomenų tipus (negalima PL/SQL spec. tipų kaip parametrai) Grąžinti duomenų tipus, kurie yra galiojantys SQL duomenų tipai (ne PL/SQL spec. tipai) Apribojimai: SQL-e kviečiamos PL/SQL f-jos parametrai turi būti perduoti poziciniu būdu. D.b. PL/SQL f-jos negali būti kviečiamos CHECK constraint sakinyje CREATE ar ALTER TABLE komandose. Taip pat f-jos begali būti naudojamos stulpelio DEFAULT reikšmės aprašymui. Reikia turėti EXECUTE privilegiją, kad iškviesti f-ją SQL sakinyje. F-jos grąžinami duomenų tipai, turi galioti SQL-e (negali būti PL/SQL tipai BOOLEAN, RECORD ar TABLE). Tie patys apribojimai taikomi ir f-jos parametrams. Pastaba: tik d.b. f-jos g.b. Naudojamos SQL sakiniuose. SQL-e negalima naudoti procedūrų. F-jos, kurios g.b. Naudojamos SQL išraiškose negali turėti OUT ir IN OUT parametrų. Kt. F-jos gali turėti tokio tipo parametrus, tačiau tai nerekomenduojama.

Apribojimai kviečiant f-jas iš SQL išraiškų 2018.12.03 Apribojimai kviečiant f-jas iš SQL išraiškų Kad funkcija galėtų būti kviečiama iš SQL sakinių, ji turi atitikti tam tikrus reikalavimus: F-jose kviečiamose iš SQL išraiškų negali būti DML sakinių Kai funkcija yra kviečiama sakinyje SELECT ar paraleliniuose (parallelized) sakiniuose INSERT, UPDATE, DELETE – funkcija negali keisti duomenų bazės lentelių Kai funkcija yra kviečiama sakiniuose INSERT, UPDATE, DELETE funkcija negali vykdyti užklausų ar keisti duomenų bazės lentelių Kai funkcija yra kviečiama sakiniuose SELECT, INSERT, UPDATE ar DELETE funkcija negali vykdyti SQL transakcijos valdymo sakinių (COMMIT) , darbo (session) valdymo sakinių (SET ROLE) ar sistemos valdymo sakinių (ALTER SYSTEM). Taip pat tokios funkcijos negali vykdyti DLL vykdymo sakinių (CREATE), nes juose automatiškai naudojamas COMMIT sakinys Kad būtų galima įvykdyti SQL sakinį su d.b. F-ja, Oracle serveris turi žinoti, kad f-ja nesukels jokių pašalinių efektų. Pašaliniai efektai tai nepriimti pasikeitimai d.b. lentelėse. Todėl reikia laikytis apribojimų, naudojant f-jas SQL išraiškose. Apribojimai: F-jose kviečiamose iš SQL išraiškų negali būti DML sakinių. F-jos kviečiamos UPDATE ar DELETE sakiniuose ant lentos T, negali vykdyti užklausos ant lentos T. F-jose kviečiamose SQL išraiškose negali būti sakinių, kurie baigia tranzakcijas. Papgrogramių kvietimas f-jose, kurios pažeidžia aukščiau išvardintus apribojimus neleistinas. Jeigu nors vienas sakinys funkcijos viduje pažeidžia kuria nors taisyklę – automatiškai vykdymo metu gaunama klaida.

Apribojimai kviečiant f-jas iš SQL išraiškų 2018.12.03 Apribojimai kviečiant f-jas iš SQL išraiškų CREATE OR REPLACE FUNCTION dml_call_sql (p_sal NUMBER) RETURN NUMBER IS BEGIN INSERT INTO employees (employee_id, last_name, email, hire_date, job_id, salary) VALUES (1, ‘employee 1’, ‘emp1@company.com’, SYSDATE, ‘SA_MAN’, 1000); RETURN (p_sal+100); END; / UPDATE employees SET salary =dml_call_sql(2000) WHERE employee_id=170; UPDATE employees SET salary=dml_call_sql(2000) ERROR at line 1 ORA-06512 table PL/SQL EMPLOYEES is mutating tiger/function may not see it ORA-06512 at “PL/SQL DML_CALL_SQL” line 4 Pavyzdyje sukuriama f-ja, kurioje atliekami DML sakiniai. T.y. f-ja DML_CALL_SQL įterpia naują įrašą į EMPLOYEES lentą. Ši f-ja kviečiama UPDATE sakinyje, kuris keičia lauką SALARY kur employee_id=170 pagal f-jos suskaičiuotą reikšmę. UPDATE sakinys grąžina klaidą, kurioje sakoma,kad lentelė mutuoja. Kt. pvz. F-ja QUERY_CALL_SQL išrenka SALARY stulpelį iš EMPLOYEES lentelės: CREATE OR REPLACE FUNCTION query_call_sql (a NUMBER) RETURN NUMBER IS s NUMBER; BEGIN SELECT salary INTO s FROM employees WHERE employee_id=170; RETURN(s+a); END; / Viršuje aprašyta f-ja, kviečiama iš UPDATE sakinio: UPDATE employees SET salary=query_call_sql(100) WHERE employee_id=170; Sukels tokią pačią klaidą kaip skaidrėje.

Funkcijos šalinimas Sintaksė: DROP FUNCTION function_name; 2018.12.03 Funkcijos šalinimas Sintaksė: DROP FUNCTION function_name; Pavyzdys: DROP FUNCTION sal_ok; Visos privilegijos ant f-jos po jos pašalinimo yra atimamos CREATE or REPLACE sintaksė yra analogiška DROP ir CREATE, tačiau ją naudojant nedingsta privilegijos ant f-jos Rollback neturi įtakos DDL komandai DROP PROCEDURE.

RETURN sakinio naudojimas 2018.12.03 RETURN sakinio naudojimas RETURN sakinys pabaigia funkcijos darbą ir valdymą perduoda iškvietėjui. Paprogramė gali turėti daugiau nei viena RETURN sakinį, o paskutinis jos sakinys nebūtinai turi būti RETURN sakinys. Priėjus bet kurį paprogramėje esantį RETURN sakinį jos darbas nutraukiamas. Didelis išėjimų iš paprogramės (RETURN sakinių) skaičius nėra gerai. RETURN sakinys privalo turėti skaitinę išraišką, kuri yra apskaičiuojama, kai vykdomas pats RETURN sakinys. Gražinamoji reikšmė yra priskiriama funkcijos vardui, ir vėliau gali būti naudojama kaip kintamasis raktiniu žodžiu RETURN nurodyto tipo. Reikia nemaišyti RETURN sakinio su raktiniu žodžiu RETURN, kuris tik aprašo gražinamos reikšmės tipą.

Skirtumai nuo procedūrų 2018.12.03 Skirtumai nuo procedūrų Priešingai nei procedūrose, funkcijose RETURN sakinys privalo turėti skaitinę išraišką PROCEDURE IN parameter OUT parameter IN OUT parameter (DECLARE) ... BEGIN EXCEPTION END; FUNCTION IN parameter (DECLARE) ... BEGIN EXCEPTION END; Kviečianti aplinka Kviečianti aplinka Procedūra kuriama veiksmų grupės saugojimui,kuriuos bus galima vėliau daug panaudoti. Procedūra gali turėti nulį ar daugiau parametrų, kurie gaunami iš kviečiančios aplinkos ir perduodami atgal kviečiančiai aplinkai. Bet procedūra neturi grąžinti reikšmės. F-ja kuriama reikšmės apskaičiavimui, kurią reikia grąžinti kviečiančiai aplinkai. F-ja gali turėti nulį ar daugiau parametrų, kurie gaunami iš kviečiančios aplinkos. F-ja turi grąžinti vieną ir tik vieną reikšmę per RETURN sakinį. F-ja naudojama SQL sakiniuose negali turėti OUT ir IN OUT parametrų.

Procedūrų ir funkcijų palyginimas 2018.12.03 Procedūrų ir funkcijų palyginimas Procedūros Vykdo PL/SQL sakinį Neturi RETURN sakinio Gali grąžinti nė vienos, vieną arba keletą reikšmių Gali turėti RETURN sakinį Funkcijos Iškviečiamos, kaip išraiškos dalis Privalo turėti RETURN sakinį antraštėje Turi grąžinti vienintelę reikšmę Turi turėti bent vieną RETURN sakinį Procedūra su vienu OUT parametru g.b. Perrašyta į f-ją su RETURN sakiniu.

DB saugomų procedūrų ir funkcijų privalumai Geresnis vykdymas Išvengiama pakartotino nagrinėjimo, kai vartotojai naudoja shared SQL area Išvengiama pakartotino PL/SQL nagrinėjimo vykdymo metu, atliekant tai kompiliacijos metu Sumažinamas kreipinių į d.b. skaičius ir sumažinamas tinklo apkrovimas sugrupavus komandas Lengvesnis palaikymas Programos keičiamos online, neįtakoja kt. vartotojų darbo Pakeitimas 1 programoje pakeičia daugelį aplikacijų Pakeitimas 1 programoje eliminuoja daugkartinį testavimą Geresnis duomenų saugumas ir vientisumas Kontroliuojamas neprivilegijuotų vartotojų netiesioginis priėjimas prie d.b. objektų Užtikrinama, kad susiję veiksmai bus atliekami kartu, arba nebus atliekami išvis Aiškesnis kodas: naudojant atitinkamus žymėjimus, kurie aprašo programos veiksmus, sumažinamas komentarų kiekis ir kodas yra lengviau skaitomas

PL/SQL paprogramių paketavimas 2018.12.03 PL/SQL paprogramių paketavimas Logiškai susijusias paprogrames galima sugrupuoti į paketą, kuris bus įrašytas į duomenų bazę Tokiu būdu paprogramėmis galės naudotis daug aplikacijų Paprogramės specifikacija rašoma paketo specifikacijoj Paprogramės kūnas – paketo kūne, kur jie yra nematomi aplikacijoms Taigi paketai leidžia paslėpti įgyvendinimo detales Pavyzdžiui: CREATE PACKAGE emp_actions AS -- package spec PROCEDURE hire_employee (emp_id INTEGER, name VARCHAR2, ...); PROCEDURE fire_employee (emp_id INTEGER); PROCEDURE raise_salary (emp_id INTEGER, amount REAL); ... END emp_actions; CREATE PACKAGE BODY emp_actions AS -- package body PROCEDURE hire_employee (emp_id INTEGER, name VARCHAR2, ...) IS BEGIN INSERT INTO emp VALUES (emp_id, name, ...); END hire_employee; PROCEDURE fire_employee (emp_id INTEGER) IS DELETE FROM emp WHERE empno = emp_id; END fire_employee; PROCEDURE raise_salary (emp_id INTEGER, amount REAL) IS UPDATE emp SET sal = sal + amount WHERE empno = emp_id; END raise_salary; Galima apibrėžti paprogrames paketo kūne nedeklaruojant jų specifikacijų paketo specifikacijoj. Tačiau tokios paprogramės gali būti iškviestos tik iš paketo vidaus.

Paprogramių vardų perkrovimas PL/SQL leidžia perkrauti paprogrames ir tipų metodus. T.y. galima naudoti tą patį vardą kelioms skirtingoms paprogramėms, jei skiriasi jų formalių parametrų kiekis, tvarka, arba duomenų tipas Perkrautas funkcijas galima įrašyti į tą patį bloką, paprogramę ar paketą Patikrinant formalius parametrus, PL/SQL nustato, kuri iš tų funkcijų yra kviečiama

Perkrovimo apribojimai Tik lokalios arba paketuose paprogramės gali būti perkrautos. Negalima perkrauti: standalone paprogramių paprogramių, kurios skiriasi tik formalių parametrų vardais arba jų būsenom dviejų paprogramių jeigu jų formalūs parametrai skiriasi tik duomenų tipais, kurie yra tos pačios duomenų tipų šeimos dviejų paprogramių jeigu jų formalūs parametrai skiriasi tik potipiais, kurie yra paremti tipais iš tos pačios šeimos dviejų funkcijų, kurios skiriasi tik grąžinamos reikšmės tipu, net jeigu tipai yra iš skirtingų šeimų

Santrauka Sužinojome, kad funkcija: 2018.12.03 Santrauka Sužinojome, kad funkcija: vardą turintis PL/SQL blokas, kuris turi grąžinti reikšmę kuriama su CREATE FUNCTION komanda iškviečiama kaip išraiškos dalis saugoma d.b. gali būti kviečiama SQL sakiniuose g.b. šalinama iš DB su DROP FUNCTION komanda Dažniausiai procedūra naudojama veiksmams atlikti f-ja naudojama reikšmei suskaičiuoti