Садржај
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 База података за продавницу - нерешени пројектни рад

Курсори са параметром

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

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

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

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

../_images/slika_73a.jpg

Илустроваћемо рад са курсором са параметром тако што ћемо приказати све позајмице члана чији се број чланске карте унесе са тастатуре.

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

Приликом отварања курсора, потребно је проследити конкретну вредност, у овом случају вредност коју смо прочитали са тастатуре и која се налази у променљивој v_broj_clanske_karte.

DECLARE
    v_broj_clanske_karte clanovi.broj_clanske_karte%TYPE;
    CURSOR kursor_pozajmica (p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE)
        IS SELECT datum_uzimanja, inventarski_broj FROM pozajmice
        WHERE broj_clanske_karte=p_broj_clanske_karte;
    v_red_pozajmica kursor_pozajmica%ROWTYPE;
BEGIN
    v_broj_clanske_karte := :broj_clanske_karte;
    OPEN kursor_pozajmica(v_broj_clanske_karte);
    LOOP
    FETCH kursor_pozajmica INTO v_red_pozajmica;
    EXIT WHEN kursor_pozajmica%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('   Datum pozajmice: '||v_red_pozajmica.datum_uzimanja);
    DBMS_OUTPUT.PUT_LINE('   Broj: '||v_red_pozajmica.inventarski_broj);
    END LOOP;
    CLOSE kursor_pozajmica;
END

На следећој слици се види како се разликује резултат рада програма за различите унете бројеве чланских карата.

../_images/slika_85a.jpg

Следи програм у којем се користи имплицитни облик рада са курсором са параметром. На самом почетку извршавања циклуса FOR се изврши упит из декларације курсора и том приликом се прослеђује вредност параметра.

DECLARE
    v_broj_clanske_karte clanovi.broj_clanske_karte%TYPE;
    CURSOR kursor_pozajmica (p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE)
        IS SELECT datum_uzimanja, inventarski_broj FROM pozajmice
        WHERE broj_clanske_karte=p_broj_clanske_karte;
BEGIN
    v_broj_clanske_karte := :broj_clanske_karte;
    FOR v_red_pozajmica IN kursor_pozajmica(v_broj_clanske_karte) LOOP
    DBMS_OUTPUT.PUT_LINE('   Datum pozajmice: '||v_red_pozajmica.datum_uzimanja);
    DBMS_OUTPUT.PUT_LINE('   Broj: '||v_red_pozajmica.inventarski_broj);
    END LOOP;
END

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

DECLARE
    v_broj_clanske_karte clanovi.broj_clanske_karte%TYPE;
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
    CURSOR kursor_pozajmica (p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE)
        IS SELECT datum_uzimanja, inventarski_broj FROM pozajmice
        WHERE broj_clanske_karte=p_broj_clanske_karte;
BEGIN
    v_broj_clanske_karte := :broj_clanske_karte;
    SELECT ime, prezime INTO v_ime, v_prezime FROM clanovi
    WHERE broj_clanske_karte=v_broj_clanske_karte;
    DBMS_OUTPUT.PUT_LINE('Clan: '||v_ime||' '||v_prezime);
    FOR v_red_pozajmica IN kursor_pozajmica(v_broj_clanske_karte) LOOP
    DBMS_OUTPUT.PUT_LINE('   Datum pozajmice: '||v_red_pozajmica.datum_uzimanja);
    DBMS_OUTPUT.PUT_LINE('   Broj: '||v_red_pozajmica.inventarski_broj);
    END LOOP;
END

На слици може да се види резултат за број чланске карте 33.

../_images/slika_85b.jpg

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

Приказати све позајмице за сваког члана. Довољно је приказати датум и инвентарски број позајмљеног примерка.

У решењу ћемо употребити један обичан курсор да прођемо кроз списак свих чланова. Курсор са параметром ћемо отворити за сваког члана посебно да бисмо приказали његове позајмице.

DECLARE
    CURSOR kursor_clan
        IS SELECT broj_clanske_karte, ime||' '||prezime clan, telefon FROM clanovi;
    CURSOR kursor_pozajmica (p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE)
        IS SELECT datum_uzimanja, inventarski_broj FROM pozajmice
        WHERE broj_clanske_karte=p_broj_clanske_karte;
BEGIN
    FOR v_red_clan IN kursor_clan LOOP
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red_clan.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red_clan.telefon);
        FOR v_red_pozajmica IN kursor_pozajmica(v_red_clan.broj_clanske_karte) LOOP
        DBMS_OUTPUT.PUT_LINE('   Datum pozajmice: '||v_red_pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE('   Broj: '||v_red_pozajmica.inventarski_broj);
        END LOOP;
    END LOOP;
END

Део резултата рада овог програма може да се види на следећој слици.

../_images/slika_85c.jpg

Програм можемо да проширимо тако да се прикажу датум и назив позајмљене књиге за сваку позајмицу.

DECLARE
    CURSOR kursor_clan
        IS SELECT broj_clanske_karte, ime||' '||prezime clan, telefon FROM clanovi;
    CURSOR kursor_pozajmica (p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE)
        IS SELECT datum_uzimanja, naziv FROM pozajmice JOIN primerci
        USING (inventarski_broj)
        JOIN knjige USING (id_knjige) WHERE broj_clanske_karte=p_broj_clanske_karte;
BEGIN
    FOR v_red_clan IN kursor_clan LOOP
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red_clan.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red_clan.telefon);
        FOR v_red_pozajmica IN kursor_pozajmica(v_red_clan.broj_clanske_karte) LOOP
        DBMS_OUTPUT.PUT_LINE('   Datum pozajmice: '||v_red_pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE('   Naziv knjige: '||v_red_pozajmica.naziv);
        END LOOP;
    END LOOP;
END

Следи решење где се експлицитно ради са курсорима.

DECLARE
    CURSOR kursor_clan
        IS SELECT broj_clanske_karte, ime||' '||prezime clan, telefon FROM clanovi;
    v_red_clan kursor_clan%ROWTYPE;
    CURSOR kursor_pozajmica (p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE)
        IS SELECT datum_uzimanja, naziv FROM pozajmice JOIN primerci
        USING (inventarski_broj)
        JOIN knjige USING (id_knjige) WHERE broj_clanske_karte=p_broj_clanske_karte;
    v_red_pozajmica kursor_pozajmica%ROWTYPE;
BEGIN
    OPEN kursor_clan;
    LOOP
        FETCH kursor_clan INTO v_red_clan;
        EXIT WHEN kursor_clan%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_red_clan.clan);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_red_clan.telefon);
        OPEN kursor_pozajmica(v_red_clan.broj_clanske_karte);
        LOOP
        FETCH kursor_pozajmica INTO v_red_pozajmica;
        EXIT WHEN kursor_pozajmica%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('   Datum pozajmice: '||v_red_pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE('   Naziv knjige: '||v_red_pozajmica.naziv);
        END LOOP;
        CLOSE kursor_pozajmica;
    END LOOP;
    CLOSE kursor_clan;
END
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+