52
Datu izgūšanas mehānismi no datu bāzes Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai datu bāzu tabulās, gan informācijas izgūšanai no šīm tabulām. Ir daudzi līdzekļi, kas pieejami PL/SQL, lai veiktu datu vaicājumu no datu bāzes un padarītu šos datus pieejamus PL/SQL programmās. Izpildot SQL priekšrakstu no PL/SQL: 1) Oracle datu bāze piešķir šim priekšrakstam privātu darba apgabalu; 2) pārvalda arī SQL priekšrakstā norādītos datus sistēmas globālajā apgabalā (SGA). Privātā darba apgabals satur informāciju par SQL priekšrakstu un datu kopu, ko šis priekšraksts ir atgriezis vai ietekmējis. PL/SQL piedāvā vairākus veidus, kā nosaukt šo darba apgabalu un manipulēt ar tajā esošo informāciju. Tie visi ietver definēšanu un darbu ar kursoriem. Ir: 1) netiešie kursori (implicit cursors). SELECT ... INTO ... izgūst vienu datu rindu lokālajos programmas mainīgajos. Tas ir vieglākais (un bieži vien visefektīvākais) ceļš uz jūsu datiem, bet tas bieži var izraisīt vairāku līdzīgu SELECT kodēšanu vairākās jūsu koda vietās. 2) tiešie kursori (explicit cursors). Var deklarēt vaicājumu tieši deklarācijas sadaļā (lokālais bloks vai programmu pakete). Šādi var atvērt un iegūt no kursora vienā vai vairākās 1

datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Datu izgūšanas mehānismi no datu bāzes

Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai datu bāzu tabulās, gan informācijas izgūšanai no šīm tabulām. Ir daudzi līdzekļi, kas pieejami PL/SQL, lai veiktu datu vaicājumu no datu bāzes un padarītu šos datus pieejamus PL/SQL programmās. Izpildot SQL priekšrakstu no PL/SQL:

1) Oracle datu bāze piešķir šim priekšrakstam privātu darba apgabalu;2) pārvalda arī SQL priekšrakstā norādītos datus sistēmas globālajā

apgabalā (SGA).Privātā darba apgabals satur informāciju par SQL priekšrakstu un datu kopu, ko šis priekšraksts ir atgriezis vai ietekmējis. PL/SQL piedāvā vairākus veidus, kā nosaukt šo darba apgabalu un manipulēt ar tajā esošo informāciju. Tie visi ietver definēšanu un darbu ar kursoriem. Ir:

1) netiešie kursori (implicit cursors). SELECT ... INTO ... izgūst vienu datu rindu lokālajos programmas mainīgajos. Tas ir vieglākais (un bieži vien visefektīvākais) ceļš uz jūsu datiem, bet tas bieži var izraisīt vairāku līdzīgu SELECT kodēšanu vairākās jūsu koda vietās.

2) tiešie kursori (explicit cursors). Var deklarēt vaicājumu tieši deklarācijas sadaļā (lokālais bloks vai programmu pakete). Šādi var atvērt un iegūt no kursora vienā vai vairākās programmās ar netiešo kursoru nepieejamu rakstu daudzumu.

3) kursora mainīgie (cursor variables). Piedāvājot papildu elastības līmeni, kursora mainīgie (deklarēti no REF CURSOR tipa) ļauj pārvietot rādītāju uz vaicājuma pamatā esošo rezultātu kopu no vienas programmas uz citu. Jebkura programma, kurai ir piekļuve šim mainīgajam, var atvērt, paņemt vai aizvērt kursoru.

4) kursora izteiksmes (cursor expresssions). CURSOR izteiksme pārveido SELECT priekšrakstu par REF CURSOR rezultātu kopu. To var izmantot ar tabulas funkcijām, lai uzlabotu programmu veiktspēju. Dinamiskie SQL vaicājumi Oracle ļauj dinamiski izveidot un izpildīt vaicājumus izpildlaikā, izmantojot kādu no vietējiem dinamiskajiem SQL (jeb NDS) vai DBMS_SQL.

1

Page 2: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Datu izguves mehānismi (kursori un speciāli buferi)

Atkarībā no izdalītajā atmiņas apgabalā veicamajām funkcijām, atmiņas apgabals un piesaistītais izpildes mehānisms tiek dažādi apzīmēts jeb nosaukts:

1) tieši (explicit) definētais kursors. Tas ir piesaistīts SQL operatoram SELECT izmantojot definējumu CURSOR … IS. Tiek izgūti vairāki vai viens tabulas raksts.

2) netieši (implicit) definētais kursors jeb SQL kursors. Tiek izmantots operatoriem INSERT, UPDATE, DELETE un SELECT … INTO. Šo kursoru nevajag atvērt un aizvērt. Tas notiek automātiski. Viena tabulas raksta apstrāde.

3) kursora mainīgais (cursor variable). Vairāku tabulas rakstu izguve izmantojot mainīgo kā norādi uz kursora struktūru. Kursora mainīgo var izmantot kā resursdatora mainīgo, kas ļauj izmantot vaicājuma rezultātus starp PL/SQL saglabātajām apakšprogrammām un viņu klientiem.

4) kursora izteiksme (cursor expression). Funkcija CURSOR atgriež iekļautu kursoru. Šai sintaksei ir šāda sintakse: CURSOR (apakšvaicājums). Varat izmantot kursora izteiksmi SELECT priekšrakstā, kas nav apakšvaicājums vai nodot to funkcijai, kas akceptē kursora mainīgo parametru. Kursora izteiksmi nevar izmantot ar netiešu kursoru.

5) SQL dināmiskā vaicājuma buferis;

6) BULK COLLECT mehānisms rakstu kopas izgūšanai (liela apjoma datu kopas izgūšana).

2

Page 3: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Ar kursora darbību saistītie termini

Kursora atribūtam ir forma %atribūta_nosaukums. Tas ir pievienots kursora vai kursora mainīgā nosaukumam. Atribūts atgriež informāciju par kursora stāvokli, piemēram, “Vai kursors ir atvērts? “un “Cik rindu ir izgūts?” Kursora atribūti darbojas nedaudz atšķirīgi attiecībā uz netiešiem un tiešajiem kursoriem un dinamisko SQL.

SELECT FOR UPDATE priekšraksts ir īpaša parastā SELECT varianta variācija, kas proaktīvi aktivizē rindu bloķēšanu katrā vaicājuma izgūtajā datu rindā. Izmantojiet SELECT FOR UPDATE tikai tad, ja jums jārezervē dati, par kuriem veicat vaicājumu, lai nodrošinātu, ka neviens datus nemaina, kamēr jūs tos apstrādājat.

Lielapjoma apstrāde Oracle datu bāzē un vēlāk PL/SQL piedāvā BULK COLLECT apkopošanas sintaksi vaicājumiem, kas ļauj vienā vai lielapjoma solī iegūt vairākas rindas no datu bāzes.

3

Page 4: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Parastās vaicājumu operācijas

Neņemot vērā kursora tipu, PL/SQL veic tās pašas operācijas, lai izpildītu SQL priekšrakstu no programmas. Dažos gadījumos PL/SQL veic šīs darbības jūsu vietā. Citos gadījumos, piemēram, ar tiešiem kursoriem, jūs paši kodēsiet un izpildīsiet šīs darbības:

1) analīze (parse). Pirmais SQL priekšraksta apstrādes solis ir analizēt to, lai pārliecinātos, vai tas ir derīgs, un noteikt izpildes plānu (izmantojot vai nu noteikumu vai izmaksu optimizētāju, atkarībā no tā, kā DBA ir iestatījusi OPTIMIZER_MODE parametru jūsu datu bāzei, datu bāzes statistikai, vaicājumu ieteikumiem utt.).

2) saistīšana (bind). Saistot programmas vērtības (resursdatora mainīgie) ar vietturiem SQL priekšrakstā. Izmantojot statisko SQL, PL/SQL programma pati veic šīs sasaistes. Izmantojot dinamisko SQL, ir tieši jāpieprasa mainīgo vērtību saistījums, ja vēlaties izmantot saistījuma mainīgos.

3) atvērt (open). Atverot kursoru, SQL priekšraksta rezultātu kopa tiek noteikta, izmantojot visus iestatītos saistījuma mainīgos. Ir iestatīts rādītājs uz aktīvo vai pašreizējo rindu uz pirmo rindu. Dažreiz jūs tieši neatvērsiet kursoru; tā vietā PL/SQL dzinējs veiks šo operāciju jūsu vietā (tāpat kā ar netiešajiem kursoriem vai vietējo dinamisko SQL).

4) izpildīt (execute). Izpildes fāzē priekšraksts tiek palaists SQL programmā.

5) ieneses (fetch). Ja tiek veikts vaicājums, FETCH komanda iegūst nākamo rindu no kursora rezultātu kopas. Katru reizi, kad ienesat, PL/SQL pārvieto rādītāju rezultātu kopā uz priekšu. Strādājot ar tiešiem kursoriem, atcerieties, ka FETCH neko nedara (nerada kļūdu), ja nav vairs izgūstamo rindu. Šī nosacījuma identificēšanai jāizmanto kursora atribūti.

6) aizvērt (close). Šī darbība aizver kursoru un atbrīvo visu kursora izmantoto atmiņu. Pēc aizvēršanas kursoram vairs nav rezultātu kopas. Dažreiz jūs tieši neaizvērsit kursoru. Tā vietā PL/SQL dzinējs veiks šo operāciju jūsu vietā (tāpat kā ar netiešajiem kursoriem vai vietējo dinamisko SQL).

4

Page 5: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Datu izgūšana

SQL

1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

2 CCC 2006-JAN-233 AAA 2007-DEC-6

DB tabula FIRMASF_NUM

F_NOS DIBIN_DAT

1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

3 AAA 2007-DEC-6

Datu bāze

Operatīvās atmiņas datu glabāšanas

struktūras (RAM vide)

5

Page 6: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

PL\SQL valodas datu glabāšanas operatīvās struktūras (datu struktūras operatīvajā atmiņā)

1) raksts (record);

2) objekts (object);

3) tabula ar indeksu (index-by table, associative array);

5) tabula ar kolekciju (nested table).

5) masīvs (array) un mainīga izmēra masīvs (variable-size array (varray)).

Saliktā datu tipā tiek glabātas vērtības, kurām ir iekšējie komponenti. Visu salikto mainīgo var attiecināt uz apakšprogrammām kā parametru. Atsevišķi var piekļūt saliktā mainīgā iekšējām sastāvdaļām. Iekšējie komponenti var būt vai nu skalāri, vai arī salikti. Skalāros komponentus var izmantot visur, kur var izmantot skalāros mainīgos. PL/SQL ļauj definēt divu veidu saliktus datu tipus: 1) kolekcija. Kolekcijā iekšējiem komponentiem vienmēr ir vienāds datu tips un tie tiek saukti par elementiem. Katram kolekcijas mainīgā elementam var piekļūt ar tā unikālo indeksu, ar šo sintaksi: variable_name (indekss). Lai izveidotu kolekcijas mainīgo, varat definēt kolekcijas tipu un pēc tam izveidot mainīgo no šī tipa vai izmantot %TYPE.2) ieraksts. Ierakstā iekšējiem komponentiem var būt dažādi datu tipi, un tos sauc par laukiem. Katram ieraksta mainīgā laukam var piekļūt pēc tā nosaukuma ar šo sintaksi: variable_name.field_name. Lai izveidotu ierakstu mainīgo, varat definēt ierakstu tipu un pēc tam izveidot mainīgo no šāda tipa vai izmantot %ROWTYPE vai %TYPE.Var izveidot ierakstu kolekciju un ierakstu, kurā ir kolekcijas.

2 CCC 2006-JAN-23

1 100 BBB 2005-FEB-152 200 CCC 2006-JAN-233 300 AAA 2007-DEC-6

100 BBB 2005-FEB-15200 CCC 2006-JAN-23300 AAA 2007-DEC-6

100 BBB 2005-FEB-15 200 CCC 2006-JAN-23

6

Page 7: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora funkcionēšanas diagramma7

Page 8: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Datu bāze

PL/SQL programma

declare. . .begin. . . SELECT .... . .SELECT .... . .end;

SGA (System Global Area)

Kursors

1)2)

3)

Datu izgūšana no datu bāzes izmantojot kursora mehānismu

Datorzinātnē datu bāzes kursors ir vadības struktūra, kas ļauj izsekot datu bāzes ierakstiem. Kursori atvieglo turpmāko apstrādi saistībā ar datu bāzes ierakstu izgūšanu, pievienošanu un dzēšanu. Datu bāzes kursors ir līdzīgs programmēšanas valodas iteratora jēdzienam.

8

Page 9: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora darbība datu izgūšanā

Lai no datu bāzes tabulas secīgi nolasītu tabulas rakstus, tiek izmantoti kursori. Izmantojot kursorus tiek veiktas sekojošas darbības:

1) kursora definēšana;2) kursora atvēršana;3) raksta vai rakstu (cikls) izgūšana;4) kursora aizvēršana.

Atmiņas buferis SGA apgabalā

Kursors

DB tabula DARBINIEKI

Izgūtie dati

Vaicājumsselect ...from ...where ...

PL/SQL programma

declare...cursor KURSORS_A is select ... ;...

beginopen KURSORS_A;fetch ...fetch ......close KURSORS_A;

end;

Datus ieraksta PL/SQL

mainīgajos un struktūrās

9

Page 10: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

1. kursora deklarēšana:

CURSOR kursora_nosaukums IS SELECT_operators;

2. kursora atvēršana:

OPEN kursora_nosaukums;

3. datu izguve no datu bāzes PL/SQL struktūrās:

FETCH kursora_nosaukums INTO mainīgo_saraksts;

4. kursora aizvēršana:

CLOSE CURSOR kursora_nosaukums;

Kursora definējums:

cursor KURSORA_NOSAUKUMS [ ( parametrs_1 [ , parametrs_2 ...]) ][return ATGRIEŠANAS_SPECIFIKACIJA ] is SELECT_izteiksme

[ for update [ of [ kolonu_saraksts ] ] ;

10

Page 11: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursoru darbību piemēri

1. kursora deklarēšana Kursors ar parametrudeclare declare cursor KURSORS_1 is cursor KURSORS_1 (parametrs_1 char(8)) is select UZV, VAR, ALGA select UZV, VAR, ALGA from DARBINIEKI from DARBINIEKI where DZIM = 'sieviete'; where DZIM = parametrs_1; 2. kursora atvēršanabegin beginopen KURSORS_1; mainig_1 := 'sieviete' ; open KURSORS_1(mainig _1);

3. viena raksta izguve no kursora un ierakstīšana PL/SQL valodas rakstābeginopen KURSORS_1fetch KURSORS_1 into raksts_1;

3'. visu rakstu izguve no kursora izmantojot ciklubeginopen KURSORS_1;loop fetch KURSORS_1 into raksts_1; exit when KURSORS_1%NOTFOUND; -- Raksta raksts_1 ierakstīšana datu tabulā vai kur citur.end loop;

4. kursora aizvēršanabegin...close KURSORS_1;

11

Page 12: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora atribūti

Kursora atribūtus var izmantot gan tieši definētiem kursoriem, gan arī netieši definētiem kursoriem: kursora_nosaukums%kursora atribūts

Ir četri nozīmīgākie kursora atribūti:

1) %NOTFOUND - jauns raksts nav atrasts vērtība ir TRUE;

2) %FOUND – jauns raksts ir atrasts vērtība ir TRUE;

3) %ISOPEN - kursors ir atvērts vērtība ir TRUE;

4) %ROWCOUNT - cik raksti nolasīti (vērtība vesals skaitlis).

5) %BULK_ROWCOUNT - returns the number of records modified by the FORALL statement for each collection element

6) %BULK_EXCEPTIONS - returns exception information for rows modified by the FORALL statement for each collection element

Piemērs. Atribūta izmantošana netieši definētajam kursoram:beginselect * into Raksts_1 FROM Darbinieki WHERE NUMURS =100;if SQL%NOTFOUND THEN INSERT INTO Darbibu_tabula (D_NUM, REZULTATS) VALUES (100, 'Nav atrasts');end if;...end;

12

Page 13: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora cikla FOR izmantošana

declare

cursor KURSORS_STUDENTI is

select * from STUDENTI where SPEC = 'Datorzinības';

type TIPS_1 is table of STUDENTI%ROWTYPE;

m_tab TIPS_1;

i number default 1;

begin

for raksts_students in KURSORS_STUDENTI loop

KURSORS_STUDENTI

m_tab(i) := raksts_students;

i := i +1;

end loop;

end;

Kursora cikla priekšrocības:1. Kursors nav jāatver.2. Izgūšanas raksta tips nav jādefinē.3. Izgūšanas beigas nav jānosaka.4. Kursors nav jāaizver.

Tabula STUDENTI

Kursors (buferis)

PL/SQL tabula m_tab

raksts_students

13

Page 14: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

DB tabulas rakstu nolasīšana un ierakstīšanai PL/SQL tabulā ar indeksiem izmantojot kursora ciklu

declarecursor KURSORS_A isselect F_NUM, F_NOS, DIBIN_DATfrom FIRMAS;type IND_TABULAS_TIPS is table of KURSORS_A%rowtype not nullindex by binary_integer;ind_tabula IND_TABULAS_TIPS;i number default 1;

begin for m_raksts in KURSORS_A loop ind_tabula(i) := m_raksts; DBMS_OUTPUT.PUT_LINE(ind_tabula(i).F_NOS); i := i +1; end loop; end;

BBBCCCAAA

FIRMASF_NUM

F_NOS DIBIN_DAT

1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

ind_tabula1 1 BBB 2005-FEB-152 2 CCC 2006-JAN-233 3 AAA 2007-DEC-6

14

Page 15: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

PL/SQL tabulas ar indeksiem atribūti

mainīgais_1 := tabulas_nosaukums.COUNT; -- Tabulas rindu skaita noteikšana.

Tiek lietoti atribūti:1) FIRST – tabulas pirmās rindas indeksa vērtības iegūšana;2) LAST – tabulas pēdējās rindas indeksa vērtības iegūšana;3) NEXT – tabulas nākošās rindas indeksa vērtības iegūšana;4) PRIOR – tabulas iepriekšējās rindas indeksa vērtības iegūšana;5) EXISTS(n) – atgriež vērtību TRUE, ja norādītais elements (rinda n) ir

tabulā;6) DELETE (I,J) – tabulas rindu no I līdz J dzēšana.

15

Page 16: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

PL/SQL programma DB tabulas rakstu nolasīšanai un ierakstīšanai PL/SQL tabulā ar kolekciju izmantojot kursoru

declarecursor KURSORS_A isselect F_NUM, F_NOS, DIBIN_DATfrom FIRMAS;type TAB_AR_KOL_TIPS is table of KURSORS_A%rowtype;tabula_ar_kol TAB_AR_KOL_TIPS := TAB_AR_KOL_TIPS();i number default 1;

begin for m_raksts in KURSORS_A loop

tabula_ar_kol.extend; tabula_ar_kol(i) := m_raksts;

DBMS_OUTPUT.PUT_LINE(Tabula_ar_kol(i).F_NOS); i := i +1; end loop; end;

BBBCCCAAA

FIRMASF_NUM

F_NOS DIBIN_DAT

1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

Tabula_ar_kol1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

16

Page 17: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

PL/SQL programma DB tabulas rakstu nolasīšanai un ierakstīšanai PL/SQL masīvā izmantojot kursoru

declarecursor KURSORS_A isselect F_NUM, F_NOS, DIBIN_DATfrom FIRMAS;type MASIVA_TIPS is varray(10) of KURSORS_A%rowtype;masivs_a MASIVA_TIPS := MASIVA_TIPS();i number default 1;

begin for m_raksts in KURSORS_A loop

masivs_a.extend;masivs_a(i) := m_raksts;

DBMS_OUTPUT.PUT_LINE(masivs_a(i).F_NOS); i := i +1; end loop; end;

BBBCCCAAA

FIRMASF_NUM

F_NOS DIBIN_DAT

1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

17

Page 18: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

BULK COLLECT komandas izmantošana DB tabulas rakstu nolasīšanai

declaretype TAB_TIPS is table of FIRMAS%ROWTYPE;

tab TAB_TIPS := TAB_TIPS(); i number;

beginselect * BULK COLLECT into tab from FIRMAS; for i in 1 ..3 loop

DBMS_OUTPUT.PUT_LINE(tab(i).F_NOS);end loop;

end;

BBBCCCAAA

Notiek automātika tabulas rindu inicializācija (EXTEND)!

tab1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

FIRMASF_NUM

F_NOS DIBIN_DAT

1 BBB 2005-FEB-152 CCC 2006-JAN-233 AAA 2007-DEC-6

18

Page 19: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora izmantošana metadatu izgūšanai no datu bāzes datu vārdnīcas (sākums)

create table FIRMAS(F_NUM number PRIMARY KEY,F_NOS varchar2(35),DIB_DAT date default SYSDATE, ADRESE varchar2(25),TELEFONS varchar2(10));

insert into FIRMAS(F_NUM, F_NOS, DIB_DAT, ADRESE, TELEFONS) values (1, 'AAA', TO_DATE('21-11-2001', 'DD-MM-YYYY'), 'Avotu iela 17 dz. 7, Rīga', '67123456');insert into FIRMAS(F_NUM, F_NOS, DIB_DAT, ADRESE, TELEFONS) values (2, 'BBB', TO_DATE('28-07-2005', 'DD-MM-YYYY'), 'Upes iela 21 dz. 15, Rīga', '67234567');

select COLUMN_NAMEfrom ALL_TAB_COLUMNSwhere TABLE_NAME = 'FIRMAS';

COLUMN_NAME-------------------------F_NUMF_NOSDIB_DATADRESETELEFONS

19

Page 20: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora izmantošana metadatu izgūšanai no datu bāzes datu vārdnīcas (turpinājums)

declarecursor KURSORS_A isselect COLUMN_NAMEfrom ALL_TAB_COLUMNSwhere TABLE_NAME = 'FIRMAS';type TAB_AR_KOL_TIPS is table of KURSORS_A%rowtype;tabula_ar_kol TAB_AR_KOL_TIPS := TAB_AR_KOL_TIPS();i number default 1;

begin for m_raksts in KURSORS_A loop

tabula_ar_kol.extend; tabula_ar_kol(i) := m_raksts;

DBMS_OUTPUT.PUT_LINE(tabula_ar_kol(i).COLUMN_NAME); i := i +1; end loop; end;

F_NUMF_NOSDIB_DATADRESETELEFONS

20

Page 21: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

DB tabulas ar objektu kolonu raksta nolasīšana un objekta komponentu izdalīšana

create or replace type ADRESE as object(PILSETA varchar2(10),IELA varchar2(15));

create table CILVEKI(C_NUM number Primary key,UZV varchar2(10),VAR varchar2(10),C_ADRESE ADRESE);

insert into CILVEKI values(1, 'Koks', 'Juris', ADRESE('Rīga', 'Stabu 10'));insert into CILVEKI values(2, 'Celms', 'Rasma', ADRESE('Rīga', 'Avotu 21'));insert into CILVEKI values(3, 'Sakne', 'Zane', ADRESE('Ogre', 'Rīgas 15'));

CILVEKI

21

Page 22: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

DB tabulas ar objektu kolonu raksta nolasīšana un objekta komponentu izdalīšana (turpinājums)

declare cursor KURSORS_CILVEKI is select * from CILVEKI; type TIPS_1 is table of KURSORS_CILVEKI%rowtype; tabula TIPS_1 := TIPS_1(); m1 CILVEKI.UZV%type; m2 CILVEKI.C_ADRESE.PILSETA%type; m3 CILVEKI.C_ADRESE.IELA%type; i number default 1; begin for raksts in KURSORS_CILVEKI loop tabula.extend; tabula(i) := raksts; m1 := raksts.UZV; m2 := raksts.C_ADRESE.PILSETA; m3 := raksts.C_ADRESE.IELA; DBMS_OUTPUT.PUT_LINE(m1 || ' ' || m2 || ' ' || m3); i := i + 1;end loop;end;

22

Page 23: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

DB tabulas ar objektu kolekciju datu nolasīšana1. DB tabulas ar kolekciju izveidošana

create or replace type JURNIEKS as object(JUR_NUM number,JUR_VAR varchar2(10),JUR_UZV varchar2(15),JUR_ALGA number(5,2));

create or replace type KOMANDA as table of JURNIEKS;

create table REISI(KAPT_NUM number Primary key,KAPT_VAR varchar2(10),KAPT_UZV varchar2(15),KAPT_ALGA number(6,2) default 0.00,R_KOMANDA KOMANDA)nested table R_KOMANDA store as REISA_KOMANDA;

insert into REISI values(1, 'Aivars', 'Valters', 230.00, KOMANDA( JURNIEKS(201, 'Uldis', 'Polis', 140.00), JURNIEKS(202, 'Valdis', 'Vimba', 150.00)));

insert into REISI values(2, 'Zane', 'Koks', 250.00, KOMANDA( JURNIEKS(301, 'Juris', 'Zars', 140.00), JURNIEKS(303, 'Rasma', 'Celms', 150.00)));

REISIKAPT_NUM KAPT_VAR KAPT_UZV KAPT_ALGA R_KOMANDA

23

Page 24: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

1 Aivars Valters 230 201 Uldis Polis 140

202 Valdis Vimba 150

201 Uldis Polis 140

202 Valdis Vimba 150

DB tabulas ar objektu kolekciju datu nolasīšana2. Datu ievade tabulā ar kolrkciju

DB tabula REISI

PL/SQL tabula tab

declare m1 REISI%ROWTYPE; type TAB_TIPS is table of KOMANDA; tab TAB_TIPS := TAB_TIPS(); begin select A.KAPT_NUM, A.KAPT_VAR, A.KAPT_UZV, A.KAPT_ALGA, A.R_KOMANDA into m1 from REISI A where A.KAPT_NUM =1;-- pirmā raksta pārrakstīšana tab.EXTEND; tab(1) := m1.R_KOMANDA; select A.KAPT_NUM, A.KAPT_VAR, A.KAPT_UZV, A.KAPT_ALGA, A.R_KOMANDA into m1 from REISI A where A.KAPT_NUM =2;-- otrā raksta pārrakstīšana tab.EXTEND; tab(2) := m1.R_KOMANDA; end;

24

Page 25: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

1 Aivars Valters 230 201 Uldis Polis 140

202 Valdis Vimba 150

201 Uldis Polis 140

202 Valdis Vimba 150

DB tabulas ar objektu kolekciju datu nolasīšana3. Kursora izmantošana DB tabulas REISI ar objektu kolekciju datu ierakstīšanai PL/SQL tabulā ar kolekciju

declare cursor KURSORS_A is select B.JUR_NUM, B.JUR_VAR, B.JUR_UZV, B.JUR_ALGA from REISI A, TABLE(A.R_KOMANDA) B; type TAB_TIPS is table of KURSORS_A%ROWTYPE; tab TAB_TIPS := TAB_TIPS(); i number default 1; m1 number; m2 varchar2(15); m3 varchar2(15); m4 number(8,2);begin for RAKSTS_JURNIEKS in KURSORS_A loop tab.EXTEND; tab(i) := RAKSTS_JURNIEKS; m1 := tab(i).JUR_NUM; m2 := tab(i).JUR_VAR; m3 := tab(i).JUR_UZV; m4 := tab(i).JUR_ALGA; DBMS_OUTPUT.PUT_LINE(TO_CHAR(m1) || ' ' || m2 || ' ' || m3 || ' ' || TO_CHAR(m4)); i := i +1; end loop; end;

201 Uldis Polis 140202 Valdis Vimba 150301 Juris Zars 140303 Rasma Celms 150

25

Page 26: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

PL/SQL mainīgo atsauču norādīšana kursorā

Tā kā kursors ir jāsaista ar SQL priekšrakstu, katram kursoram ir jāatsaucas vismaz uz vienu tabulu no datu bāzes un no tās (un no klauzulas WHERE) jānosaka, kuras rindas tiks atgrieztas aktīvajā kopā. Tomēr tas nenozīmē, ka PL/SQL kursora SELECT var atgriezt tikai datu bāzes informāciju. To izteiksmju saraksts, kas tiek parādītas pēc atslēgvārda SELECT un pirms atslēgvārda FROM izsauc atlases sarakstu. Vietējā SQL šajā atlasītajā sarakstā var būt gan kolonnas, gan izteiksmes (SQL funkcijas šajās kolonnās, konstantes utt.). PL/SQL atlasītajā sarakstā var būt PL/SQL mainīgie un sarežģītas izteiksmes. Varat atsaukties uz vietējiem PL/SQL programmas datiem (PL/SQL mainīgajiem un konstantēm), kā arī uz resursvalodas saistīšanas mainīgajiem, WHERE, GROUP BY un HAVING ir kursora SELECT pārskata klauzulas. Jūs varat un jums ir jākvalificē arī atsauce uzPL/SQL mainīgais ar tā tvēruma (scope) nosaukumu (procedūras nosaukumu, pakotnes nosaukumu utt.), īpaši SQL priekšrakstā. Plašāku informāciju par šo tēmu skatiet “Scope”.

26

Page 27: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Darbs ar netiešu (implicit) kursoru

PL/SQL, tiek deklarēts un pārvaldīts netiešais kursors ikreiz, kad izpildāt SQL DML priekšrakstu (INSERT, UPDATE, MERGE, DELETE) vai SELECT INTO, kas atgriež datus no datu bāzes tieši PL/SQL datu struktūrā. Šāda veida kursoru sauc par netiešo, jo datu bāze netieši vai automātiski veic daudzas ar kursoru saistītas darbības, piemēram, piešķir atmiņu kursoram, atver kursoru, realizē ienesi utt.

Netiešais kursors ir SELECT priekšraksts, kam piemīt šīs īpašās īpašības:1) SELECT priekšraksts parādās bloka izpildāmā sadaļā. Tas nav definēts

deklarācijas sadaļā, kā tieši kursori. 2) vaicājumā ir iekļauta INTO klauzula (vai BULK COLLECT INTO

lielapjoma apstrādei). INTO klauzula ir PL/SQL (nevis SQL) valodas daļa, un tas ir mehānisms, ko izmanto datu pārsūtīšanai no datu bāzes uz lokālām PL/SQL datu struktūrām.

3) jūs neatverat, nedefinējat ieneses vai neaizverat SELECT priekšrakstu. Visas šīs darbības tiek veiktas automātiski.

Vaicājuma sintakse:SELECT column_list [BULK COLLECT] INTO PL/SQL variable list ...rest of SELECT statement...

27

Page 28: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Netiešā kursora atribūti

SQL%FOUND returns TRUE if one row (or more, in the case of BULK COLLECT INTO) was fetched successfully, and FALSE otherwise (in which case the database will also raise the NO_DATA_FOUND exception).

SQL%NOTFOUND returns TRUE if a row was not fetched successfully (in which case the database will also raise the NO_DATA_FOUND exception), and FALSE otherwise.

SQL%ROWCOUNT returns the number of rows fetched from the specified cursor thus far. For a SELECT INTO, this will be 1 if a row was found and 0 if the database raises the NO_DATA_FOUND exception.

SQL%ISOPEN Always returns FALSE for implicit cursors because the database opens and closes implicit cursors automatically.

28

Page 29: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Netieša kursora piemēri

DECLARE l_title books.title%TYPE; BEGIN SELECT title INTO l_title FROM books WHERE isbn = '0-596-00121-5';

DECLARE l_book books%ROWTYPE; BEGIN SELECT * INTO l_book FROM books WHERE isbn = '0-596-00121-5';

SELECT SUM (salary) INTO department_total FROM employees WHERE department_id = 10;

29

Page 30: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Tiešā kursora izmantošana

Tiešais kursors ir SELECT priekšraksts, kas ir skaidri definēts koda deklarācijas sadaļā, un procesa laikā tam ir piešķirts nosaukums. Tiešo kursoru nelieto INSERT, UPDATE, MERGE un DELETE gadījumos. Izmantojot tiešos kursorus, jūs varat pilnībā kontrolēt dažādus PL/SQL soļus, kas saistīti ar datu bāzes informācijas izgūšanu. Jūs izlemjat, kad atvērt kursoru, kad iegūt ierakstus no kursora (un tāpēc no tabulas vai tabulām kursora SELECT priekšrakstā), cik daudz ierakstu ienest un kad aizvērt kursoru. Informācija par pašreizējo kursora stāvokli ir pieejama, izpētot kursora atribūtus. Šī kontroles granularitāte padara tieši kursoru par nenovērtējamu rīku vajadzībām.

CURSOR cursor_name [ ( [ parameter [, parameter ...] ) ] [ RETURN return_specification ] IS SELECT_statement [FOR UPDATE [OF [column_list]];

30

Page 31: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Tiešā kursora izmantošanas piemērs

FUNCTION jealousy_level (NAME_IN IN friends.NAME%TYPE) RETURN NUMBER AS CURSOR jealousy_cur IS SELECT location FROM friends WHERE NAME = UPPER (NAME_IN); jealousy_rec jealousy_cur%ROWTYPE; retval NUMBER; BEGIN OPEN jealousy_cur; FETCH jealousy_cur INTO jealousy_rec; IF jealousy_cur%FOUND THEN IF jealousy_rec.location = 'PUERTO RICO' THEN retval := 10; ELSIF jealousy_rec.location = 'CHICAGO' THEN retval := 1; END IF; END IF; CLOSE jealousy_cur; RETURN retval; EXCEPTION WHEN OTHERS THEN IF jealousy_cur%ISOPEN THEN CLOSE jealousy_cur; END IF; END;

31

Page 32: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Kursora definējums paketē

PACKAGE book_info IS

CURSOR titles_cur IS SELECT title FROM books;

CURSOR books_cur (title_filter_in IN books.title%TYPE) RETURN books%ROWTYPE IS SELECT * FROM books WHERE title LIKE title_filter_in; END;

32

Page 33: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

Tiešā kursora atribūti

cursor%FOUND Returns TRUE if a record was fetched successfully cursor%NOTFOUND Returns TRUE if a record was not fetched successfully cursor%ROWCOUNT Returns the number of records fetched from the specified cursor at that point in time cursor%ISOPEN Returns TRUE if the specified cursor is open

Operation %FOUND %NOTFOUND %ISOPEN %ROWCOUNT Before OPEN ORA-01001 raised ORA-01001 raised FALSE ORA-01001 raised After OPEN NULL NULL TRUE 0 Before first FETCH NULL NULL TRUE 0 After first FETCH TRUE FALSE TRUE 1 Before subsequent FETCH(es) TRUE FALSE TRUE 1 After subsequent FETCH(es) TRUE FALSE TRUE Data-dependent Before last FETCH TRUE FALSE TRUE Data-dependent After last FETCH FALSE TRUE TRUE Data-dependent Before CLOSE FALSE TRUE TRUE Data-dependent After CLOSE Exception Exception FALSE Exception

33

Page 34: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

SELECT ... FOR UPDATE

Izdodot datu bāzē SELECT priekšrakstu, lai pieprasītu dažus ierakstus, atlasītajās rindās netiek uzliktas slēdzenes. Kopumā šī ir īpašība, jo katrā noteiktā laikā bloķēto ierakstu skaits tiek saglabāts līdz absolūtajam minimumam: bloķēti tiek tikai tie ieraksti, kas ir mainīti, bet vēl nav izdarīti. Pat tad citi spēj lasīt šos ierakstus, kā tie parādījās pirms izmaiņām (datu “pirms attēla”). Tomēr ir laiki, kad vēlaties bloķēt ierakstu kopu pat pirms izmaiņu veikšanas programmā. Oracle piedāvā SELECT priekšraksta FOR UPDATE klauzulu, lai veiktu šo bloķēšanu. Kad veicat SELECT... FOR UPDATE priekšrakstam datu bāze automātiski iegūst rindu līmeņa slēdzenes visās rindās, ko identificē SELECT priekšraksts, saglabājot ierakstus “tikai savām izmaiņām”, kad pārvietojaties pa kursora izgūtajām rindām. Ir tā, it kā rindas būtu atjauninātas, bet tās nav iegūstamas ar SELECT. Neviens cits nevarēs mainīt nevienu no šiem ierakstiem, kamēr nebūsit ROLLBACK vai COMMIT bet citas sesijas joprojām varēs lasīt datus.

Atjaunināšanas klauzulu FOR UPDATE var izmantot SELECT vairākām tabulām. Šādā gadījumā tabulas rindas tiek bloķētas tikai tad, ja FOR UPDATE klauzulā ir atsauce uz šīs tabulas kolonnu.

CURSOR fall_jobs_cur IS SELECT w.task, w.expected_hours, w.tools_required, w.do_it_yourself_flag FROM winterize w, husband_config hc WHERE w.year_of_task = TO_CHAR (SYSDATE, 'YYYY') AND w.task_id = hc.task_id FOR UPDATE OF hc.max_procrastination_allowed;

34

Page 35: datubaze.files.wordpress.com · Web viewDatu izgūšanas mehānismi no datu bāzes. Viena no PL/SQL valodas iezīmēm ir tās ciešā integrācija ar Oracle datu bāzi gan datu mainīšanai

WHERE CURRENT OF

PL/SQL klauzula norāda, kur ir spēkā UPDATE un DELETE priekšraksti, kas atrodas kursora iekšpusē. Šī klauzula ļauj viegli veikt izmaiņas nesen ienesto datu rindā. Lai atjauninātu kolonnas pēdējā ieneses rindā, norādiet:

UPDATE table_name SET set_clause WHERE CURRENT OF cursor_name;

35