Iekļautās procedūras

**Iekļautās procedūras un funkcijas** ir sagatavots SQL kods, kurš tiek saglabāts, lai to varētu atkārtoti izmantot. Vēl viens no terminiem: Iekļautā procedūra ir subrutīna, kas ir pieejama lietojumprogrammatūraām ar piekļuvi Relāciju datubāzes pārvaldības sistēmai. Iekļautā procedūra (dažkārt to apzīmē ar proc, sproc, StoPro, StoredProc, sp vai SP) faktiski tiek glabāta datu bāzes datu vārdnīcā.

DBVS saglabātā procedūra ir komplekts no SQL pieprasījumiem, kuri veic konkrētu uzdevumu. Saglabātajai procedūrai tiek piešķirts vārds un tā tiek glabāta datubāzē. Ļoti svarīga priekš klienta-servera datubāzes sistēmām, jo procedūra tiek saglabāta servera pusē - tas nozīmē, ka tā ir pieejama visiem klientiem. Kad procedūra tiek pārveidota, visi klienti automātiski saņem jauno versiju.

Iekļautās procedūras var atgriezt rezultātu kopas, t.i., *SELECT* priekšraksta rezultātus. Šādas rezultātu kopas var apstrādāt, izmantojot kursorus, bet citas iekļautās procedūras, saistot rezultātu kopas vietrādi vai izmantojot lietojumprogrammas. Iekļautajās procedūrās var būt ietverti arī datu apstrādei paredzēti deklarēti mainīgie un kursori, kas tām ļauj veidot cilpas vairākās rindās tabulās. Iekļauto procedūru plūsmas vadības priekšrakstos parasti ietilpst *IF*, *WHILE*, *LOOP*, *REPEAT* un *CASE* priekšraksti, kā arī daudz citu. Iekļautās procedūras var saņemt mainīgos, atgriezt rezultātus un modificēt mainīgos un tos atgriezt atkarībā no tā, kā un kur ir deklarēts mainīgais.

Saglabātās procedūras samazina tīkla noslogojumu, uzlabo izpildījumu, var paaugstināt lietotnes ātrdarbību. Katru reizi kad tiek veikts pieprasījums Datu bāzei, tas tiek analizēts un optimizēts. Ja pieprasījums ir saglabātajā procedūrā, tad tas tiek analizēts un optimizēts tikai vienreiz, un pēc tam analīzes rezultāti tiek saglabāti datu bāzē - nākamajā reizē tas nav jādara. Ja ir pieprasījums, kurš tiek veikts regulāri, tad šādā veidā var paātrināt sistēmas kopējo darbību.

Saglabātās procedūras pieņem ievades vērtību - vienu un to pašu procedūru var izmantot dažādi klienti ar dažādām ievades vērtībām.

Lielāka daļa DBVS (Oracle datubāze, Microsoft SQL Server, MySQL) atbalsta saglabātās procedūras.

Vispirms procedūra vai funkcija tiek izveidota, saglabāta un nokompilēta datubāzē (*CREATE PROCEDURE* vai *CREATE FUNCTION*). Šai brīdī parasti DBVS veic arī zināmas pārbaudes, vai procedūra/funkcija ir korekta sintaktiski, vai ir pieejami tajā minētie objekti u.c.

`<pre>
CREATE PROCEDURE uspGetAddress @City nvarchar(30)
AS
SELECT * 
FROM AdventureWorks.Person.Address
WHERE City = @City
GO</pre>`

Pēc tam, kad procedūra vai funkcija ir veiksmīgi izveidota un bez kļūdām nokompilēta, to var izpildīt.
(CALL procedure(...) vai EXECUTE procedure(...))

EXEC uspGetAddress @City = 'Riga'

## Ieviešana
Katrā datubāzes sistēmā ir atšķirīga precīza un pareiza iekļauto procedūru ieviešana. Lielākā daļa galveno datubāzu piegādātāju tās piegādā noteiktās formās. Atkarībā no datubāzes sistēmas iekļautās procedūras var tikt ieviestas dažādās programmēšanas valodās, piemēram, SQL, Java (programmēšanas valoda), C (programmēšanas valoda) un C++. Iekļautās procedūras, kas uzrakstītas tādās valodās, kas nav SQL programmēšanas valodas, pašas vai nu var, vai nevar izpildīt SQL priekšrakstus.
Tā kā iekļautās procedūras tika lietotas aizvien biežāk, SQL valodā ir ieviesti procedurāli elementi SQL:1999 un SQL:2003 standartos daļas SQL/PSM. Tā SQL kļuva par imperatīvu programmēšanas valodau. Lielākā daļa datu bāzežu sistēmu piedāvā īpašumtiesībām un piegādātājam raksturīgus paplašinājumus, kas pārsniedz SQL/PSM. Standarta specifikācijas pastāv gan Java (programmēšanas valoda) iekļautajām procedūrām, gan SQL/JRT.

## Salīdzinājums ar funkcijām
* Funkcija ir apakšprogramma, kas uzrakstīta konkrētu aprēķinu veikšanai.
* Skalārā funkcija atgriež tikai vienu vērtību (vai vērtību *NULL*), savukārt tabulas funkcija atgriež (relāciju) tabulu, kurā ietilpst nulle vai vairāk rindu, un katrā rindā ir viena vai vairākas kolonnas.
* Funkcijām ir jāatgriež vērtība (izmantojot *RETURN* atslēgvārdu), bet iekļautajām procedūrām tas nav obligāts noteikums.
* Iekļautās procedūras var izmantot *RETURN* atslēgvārdu, bet neviena vērtība netiek nodota.
* Funkcijas var tikt izmantotas *SELECT* priekšrakstos ar nosacījumu, ka tās neveic nekādu datu manipulāciju. Savukārt procedūras *SELECT* priekšrakstos iekļaut nevar.
* Iekļautā procedūra var atgriezt vairākas vērtības, izmantot *OUT* parametru, vai neatgriezt nevienu vērtību.
* Iekļautā procedūra var ietaupīt vaicājuma kompilēšanas laiku.

## Salīdzinājums ar sagatavotajiem priekšrakstiem
Sagatavotie priekšraksti var izmantot parastu priekšrakstu vai vaicājumu un parametrizēt to tā, atšķirīgas literāļa vērtības varētu tikt izmantotas vēlāk. Tie tāpat kā iekļautās procedūras efektivitātes dēļ tiek glabāti serverī un nodrošina zināmu aizsardzību no SQL injekciju uzbrukumiem. Lai gan sagatavotie priekšraksti ir vienkāršāki un deklaratīvāki, parasti tie netiek rakstīti, lai izmantotu procedurālo loģiku, un nevar darboties ar mainīgajiem. Tā kā šiem priekšrakstiem ir vienkāršs interfeiss un klienta puses ieviešana, tie visbiežāk ir atkārtoti lietojami starp datubāzes pārvaldības sistēmām (Database management system — DBMS).

## Trūkumi
* Iekļauto procedūru valodas bieži vien ir atkarīgas no piegādātāja. Ja ir jāpārslēdzas uz citu piegādātāja datu bāzi, visticamāk būs jāpārraksta arī katra iekļautā procedūra.
* Dažādu piegādātāju nodrošināto iekļauto procedūru valodām ir atšķirīgi sarežģītības līmeņi.
** Piemēram, Oracle PL/SQL ir vairāk valodas funkciju un iebūvētu līdzekļu (izmantojot tādas pakotnes kā DBMS_ un UTL_  u.c.) nekā Microsoft T-SQL.
* Iekļauto procedūru rakstīšanas un atkļūdošanas rīku atbalsts bieži vien nav tik labs kā citām programmēšanas valodām, tomēr arī šeit tas atšķiras atkarībā no piegādātāja un valodas.
** Piemēram, gan PL/SQL, gan T-SQL ir īpaši paredzētas IDE un atkļūdotāji. PL/PgSQL var atkļūdot no dažādām IDE.

## Atsauces