Садржај
1 Релационе базе података
1.0 1 Релационе базе података
1.0 2 Релационе базе података - квиз
1.0 3 Веза један према више
1.0 4 Веза један према више - квиз
1.0 5 Веза више према више
1.0 6 Веза више према више - квиз
1.0 7 Алат за пројектовање
1.0 8 СУБП
1.0 9 Креирање базе на други начин
1.0 10 Још неке SQL команде
1.1 1 Упит SELECT
1.1 2 Упит SELECT - упит из једне табеле - задаци
1.1 3 Упит SELECT - упит из једне табеле - квиз
1.1 4 Упит SELECT - функције и подупити - задаци
1.1 5 Упит SELECT - функције и подупити - квиз
1.1 6 Упит SELECT - спајање - задаци
1.1 7 Упит SELECT - спајање - квиз
1.1 8 Упит SELECT - нерешени задаци
1.2 1 База података за библиотеку - креирање базе
1.2 2 БП Библиотека - Упит SELECT - упит из једне табеле - задаци
1.2 3 БП Библиотека - Упит SELECT - упит из једне табеле - нерешени задаци
1.2 4 БП Библиотека - Упит SELECT - спајање - задаци
1.2 5 БП Библиотека - Упит SELECT - спајање - нерешени задаци
1.2 6 БП Библиотека - Упит SELECT - функције и подупити - задаци
1.2 7 БП Библиотека - Упит SELECT - функције и подупити - нерешени задаци
1.3 1 База података за возачке дозволе - креирање базе
1.3 2 БП Возачке дозволе - Дијаграм и подаци - практичан рад
1.3 3 БП Возачке дозволе - Упит SELECT - задаци
1.3 4 БП Возачке дозволе - Упит SELECT - нерешени задаци
1.4 1 БП Филмови - Креирање базе - практични рад
1.4 2 БП Филмови - Дијаграм и подаци - практични рад
1.4 3 БП Филмови - Упит SELECT - задаци
1.4 4 БП Филмови - Упит SELECT - нерешени задаци
2 Писање програма унутар система за управљање базама података
2.0 1 Процедуре и команда INSERT
2.0 2 Процедуре и команде UPDATE и DELETE
2.0 3 Процедуре и команде INSERT, UPDATE, и DELETE - квиз
2.0 4 Процедуре и тестирање програма
2.0 5 Процедуре и упит SELECT
2.0 6 Процедуре и курсор за упит SELECT
2.1 1 Функције и упит SELECT
2.1 2 Процедуре и функције са упитом SELECT - квиз
2.1 3 Процедуре и функције са упитом SELECT из једне табеле - задаци
2.1 4 Процедуре и функције са упитом и групним функцијама - задаци
2.1 5 Процедуре и функције са упитом SELECT са спајањем табела - задаци
2.1 6 Процедуре и функције са упитом - нерешени задаци
2.1 7 Формат XML
2.2 1 База података за библиотеку - Процедуре, функције и поређење различитих решења
2.2 2 Процедуре, функције и поређење различитих решења
2.2 3 Процедуре и функције са упитом SELECT из једне табеле - вежбање
2.2 4 Процедуре и функције са упитом SELECT са спајањем табела - вежбање
2.2 5 Процедуре и функције са упитом и групним функцијама и подупитима - вежбање
2.2 6 Процедуре и функције са упитом SELECT - нерешени задаци
2.3 1 База података за возачке дозволе - процедуре и функције са упитом SELECT - вежбање
2.3 2 База података за возачке дозволе - процедуре и функције - нерешени задаци
2.4 1 База података за филмове - процедуре и функције са упитом SELECT - вежбање
2.4 2 База података за филмове - процедуре и функције - нерешени задаци
3 Писање програма у програмским језицима вишег нивоа
3.0 1 Писање програма у развојном окружењу Visual Studio
3.0 2 Писање програма у развојном окружењу Visual Studio - практичан рад
3.0 3 Писање програма у развојном окружењу Visual Studio - процедуре
3.0 4 Писање програма у развојном окружењу Visual Studio - квиз
3.1 1 Угнежђени упит SELECT унутар програма
3.1 2 Угнежђени упит SELECT унутар програма - задаци
3.1 3 Позив процедуре унутар програма
3.1 4 Позив креиране функције унутар програма
3.1 5 Програм са угнежђеним командама у развојном окружењу Visual Studio - квиз
3.1 6 Програм са угнежђеним упитом SELECT из једне табеле - вежбање
3.1 7 Програм са угњежђеним упитом и групним фунцкијама - вежбање
3.1 8 Програм са угнежђеним упитом SELECT са спајањем табела - вежбање
3.1 9 Програм са класом
3.1 10 Програм са угнежђеним упитом - нерешени задаци
3.1 11 Програм са угнежђеним командама INSERT, UPDATE, и DELETE
3.2 1 База података за библиотеку - програм са угнежђеним упитом SELECT из једне табеле - задаци
3.2 2 База података за библиотеку - програм са угнежђеним упитом SELECT - вежбање
3.2 3 База података за библиотеку - програм са угнежђеним упитом - нерешени задаци
3.3 1 База података за возачке дозволе - програм са угнежђеним упитом SELECT - вежбање
3.3 2 База података за возачке дозволе - програм са угнежђеним упитом - нерешени задаци
3.4 1 База података за филмове - програм са угнежђеним упитом SELECT - вежбање
3.4 2 База података за филмове - програм са угнежђеним упитом - нерешени задаци
4 Друга софтверска решења - СУБП Oracle
4.0 1 Oracle Apex и језик PL/SQL
4.0 2 Језик PL/SQL - задаци
4.0 3 Језик PL/SQL - квиз
4.0 4 Језик PL/SQL – нерешени задаци
4.0 5 Наредбе гранања
4.0 6 Наредбе гранања - нерешени задаци
4.0 7 Наредбе циклуса
4.0 8 Наредбе циклуса - нерешени задаци
4.1 1 База података за библиотеку - практичан рад
4.1 2 Наредба SELECT INTO
4.1 3 Наредба SELECT INTO - zadaci
4.1 4 Наредба SELECT INTO - квиз
4.1 5 Наредба SELECT INTO - вежбање
4.1 6 Наредба SELECT INTO - нерешени задаци
4.2 1 Курсори - Узимање података из више редова
4.2 2 Курсори - задаци
4.2 3 Различити начини да се реши проблем
4.2 4 Курсори - нерешени задаци
4.2 5 Курсор са параметром
4.2 6 Курсор са параметром - задаци
4.2 7 Курсор са параметром - нерешени задаци
4.2 8 Курсори - квиз
4.2 9 Курсори и гранање - задаци
4.2 10 Курсори - вежбање
4.2 11 Тренутне позајмице члана - пример
4.2 12 Спискови књига - пример
4.3 1 Процедуре и функције у СУБП-у Oracle Apex
4.3 2 Процедуре и функције - задаци
4.3 3 Процедуре и функције - нерешени задаци
4.3 4 Позајмице једне књиге - пример
4.3 5 Тренутне позајмице - пример
4.3 6 Процедуре и друге SQL команде
4.3 7 Тригери
4.3 8 Списак свих објеката у бази података
4.4 1 Креирање апликације помоћу алата App Builder
4.4 2 Додатне опције App Builder алата
4.4 3 Покретање апликације
4.4 4 Креирање нових страница у апликацији
4.4 5 Покретање раније креиране процедуре
4.4 6 Алат App Builder и XML
4.5 1 База података за салон аутомобила у СУБП-у Oracle Apex - 1. део
4.5 2 База података за салон аутомобила у СУБП-у Oracle Apex - 2. део
4.5 3 База података за салон аутомобила у СУБП-у Oracle Apex - 3. део
4.5 4 База података за продавницу - нерешени пројектни рад

Курсори - узимање података из више редова

У PL/SQL програму најчешће треба да искористимо упит који узима податке из више редова. У том случају је неопходно да употребимо курсор. Са курсором може да се ради експлицитно и имплицитно, и обавезно мора да се користи у комбинацији са циклусом који нам омогућава да идемо ред по ред кроз податке које обрађујемо.

Следе примери програма написаних у језику PL/SQL који користе курсоре.

Програми се пишу у едитору у оквиру онлајн окружења Oracle APEX, а покрећу се кликом на дугме Run:

Креирати PL/SQL програме који узимају податке из базе података библиотеке. Следи списак свих табела са колонама. Примарни кључеви су истакнути болд, а страни италик.

../_images/slika_73a.jpg

Вратимо се на проблем који смо већ раније решили. Приказати име, презиме и телефон члана библиотеке са бројем чланске карте 22. Име и презиме приказати спојено. За овај проблем користимо SELECT INTO зато што су нам потребни подаци из тачно једног реда, реда у којем се налазе подаци о члану са бројем чланске карте 22.

DECLARE
    v_clan VARCHAR2(150);
    v_telefon clanovi.telefon%TYPE;
BEGIN
    SELECT ime||' '||prezime, telefon INTO v_clan, v_telefon
    FROM clanovi WHERE broj_clanske_karte=22;
    DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_clan);
    DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
END

Уколико желимо да прикажемо ове податке за све чланове, морамо да користимо курсор. Да бисмо радили са курсором, неопходни су следећи кораци:

  1. курсор се у одељку за декларацију креира и веже за SELECT упит,

  2. курсор се отвори у телу PL/SQL програма и тада се изврши упит из декларације,,

  3. у циклусу се помоћу курсора чита један по један ред док се не прочитају сви редови резултата одговарајућег SELECT упита,

  4. курсор се затвори.

Упознаћемо се са овом корацима кроз решење следећег задатка. Приказати имена, презимена и телефоне свих чланова библиотеке. Име и презиме приказати спојено.

DECLARE
    v_clan VARCHAR2(150);
    v_telefon clanovi.telefon%TYPE;
    CURSOR kursor_clan IS SELECT ime||' '||prezime, telefon FROM clanovi;
BEGIN
    OPEN kursor_clan;
    LOOP
        FETCH kursor_clan INTO v_clan, v_telefon;
        EXIT WHEN kursor_clan%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
    END LOOP;
    CLOSE kursor_clan;
END
../_images/slika_81a.jpg ../_images/slika_81b.jpg

Можемо да користимо променљиву сложеног типа да у њу учитамо цео ред.

Променљива v_red има онолико поља колико има одговарајући SELECT упит. Како је прва колона добијена као израз, важно је да јој се додели име, у овом случају clan, тако да може да се приступа том пољу сложене променљиве на следећи начин: v_red.clan (назив променљиве, тачка, назив поља).

DECLARE
    CURSOR kursor_clan IS SELECT ime||' '||prezime clan, telefon FROM clanovi;
    v_red kursor_clan%ROWTYPE;
BEGIN
    OPEN kursor_clan;
    LOOP
        FETCH kursor_clan INTO v_red;
        EXIT WHEN kursor_clan%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red.telefon);
    END LOOP;
    CLOSE kursor_clan;
END

Овакав облик рада са курсором се назива експлицитни и подразумева да експлицитно набројимо сваки корак који са курсором треба да се изврши. Курсор може имплицитно да се отвори, да се чита ред по ред и да се затвори, употребом циклуса FOR.

DECLARE
    CURSOR kursor_clan IS SELECT ime||' '||prezime clan, telefon FROM clanovi;
    v_red kursor_clan%ROWTYPE;
BEGIN
    FOR v_red IN kursor_clan LOOP
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red.telefon);
    END LOOP;
END

Променљива које се користи у циклусу FOR не мора да се експлицитно декларише, тако да ће следећи блок кода такође радити.

DECLARE
    fon FROM clanovi;
BEGIN
    FOR v_red IN kursor_clan LOOP
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red.telefon);
    END LOOP;
END

База података за библиотеку коју користимо нема превелики број података. Најчешће у базама имамо табеле са веома великим бројем редова и није могуће да све податке из табеле повучемо у програм. Из тог разлога можемо да ограничимо број редова из којих узимамо податке користећи у упиту FETCH FIRST ROWS ONLY уз навођење броја редова који нам је потребан.

Следећи програм узима само податке о прва три члана.

Како је пример базе података за библиотеку мали, ово нећемо употребљавати у програмима који следе, али би требало да увек имате у виду да се FETCH FIRST ROWS ONLY, или нека друга опција за ограничавање броја редова који се узимају, обавезно користи у већим базама података.

DECLARE
    CURSOR kursor_clan IS SELECT ime||' '||prezime clan, telefon
    FROM clanovi FETCH FIRST 3 ROWS ONLY;
BEGIN
    FOR v_red IN kursor_clan LOOP
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red.telefon);
    END LOOP;
END

У овим примерима смо у назив курсора ставили на почетак реч kursor, а промељиву за читање једног реда смо звали v_red. Могу, наравно, да се користе и другачији називи, и неки примери именовања курсора и одговарајуће променљиве ће бити приказани у задацима који следе.

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+