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

Тренутне позајмице члана - пример

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

https://petlja.org/kurs/7963/11/6720

  1. Члан библиотеке са својом чланском картом број 33 дошао је да позајми неколико књига. Пре него што му библиотека изда нове, потребно је да се провери да ли члан тренутно држи неке књиге код себе.

Задатак: Написати упит којим се приказују датуми узимања и инвентарски бројеви књига које се тренутно налазе код члана са бројем чланске карте 33.

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

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

../_images/slika_73a.jpg

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

SELECT datum_uzimanja, inventarski_broj
FROM pozajmice
WHERE broj_clanske_karte=33 AND datum_vracanja IS NULL

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

DECLARE
    CURSOR trenutne_pozajmice IS
            SELECT datum_uzimanja, inventarski_broj
            FROM pozajmice
            WHERE broj_clanske_karte=33 AND datum_vracanja IS NULL;
    pozajmica trenutne_pozajmice%ROWTYPE;
BEGIN
    OPEN trenutne_pozajmice;
    LOOP
        FETCH trenutne_pozajmice INTO pozajmica;
        EXIT WHEN trenutne_pozajmice%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Datum: '||pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE('Inventarski broj: '||pozajmica.inventarski_broj);
    END LOOP;
    CLOSE trenutne_pozajmice;
END

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

DECLARE
    CURSOR trenutne_pozajmice IS
            SELECT datum_uzimanja, inventarski_broj
            FROM pozajmice
            WHERE broj_clanske_karte=33 AND datum_vracanja IS NULL;
BEGIN
    FOR pozajmica IN trenutne_pozajmice LOOP
        DBMS_OUTPUT.PUT_LINE('Datum: '||pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE('Inventarski broj: '||pozajmica.inventarski_broj);
    END LOOP;
END

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

DECLARE
    CURSOR trenutne_pozajmice IS
        SELECT datum_uzimanja, inventarski_broj, naziv
        FROM pozajmice JOIN primerci USING (inventarski_broj)
        JOIN knjige USING (id_knjige) WHERE broj_clanske_karte=33
        AND datum_vracanja IS NULL;
    pozajmica trenutne_pozajmice%ROWTYPE;
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
BEGIN
    SELECT ime, prezime INTO v_ime, v_prezime
    FROM clanovi WHERE broj_clanske_karte=33;
    DBMS_OUTPUT.PUT_LINE('CLAN: '||v_ime||' '||v_prezime);
    OPEN trenutne_pozajmice;
    LOOP
        FETCH trenutne_pozajmice INTO pozajmica;
        EXIT WHEN trenutne_pozajmice%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(' Datum: '||pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE(' Inventarski broj: '||pozajmica.inventarski_broj);
        DBMS_OUTPUT.PUT_LINE(' Naziv knjige: '||pozajmica.naziv);
    END LOOP;
    CLOSE trenutne_pozajmice;
END

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

DECLARE
    CURSOR trenutne_pozajmice(p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE) IS
        SELECT datum_uzimanja, inventarski_broj, naziv
        FROM pozajmice JOIN primerci USING (inventarski_broj)
        JOIN knjige USING (id_knjige)
        WHERE broj_clanske_karte=p_broj_clanske_karte AND datum_vracanja IS NULL;
    pozajmica trenutne_pozajmice%ROWTYPE;
    v_broj_clanske_karte clanovi.broj_clanske_karte%TYPE;
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
BEGIN
    v_broj_clanske_karte := :broj_cl_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);
    OPEN trenutne_pozajmice(v_broj_clanske_karte);
    LOOP
        FETCH trenutne_pozajmice INTO pozajmica;
        EXIT WHEN trenutne_pozajmice%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(' Datum: '||pozajmica.datum_uzimanja);
        DBMS_OUTPUT.PUT_LINE(' Inventarski broj: '||pozajmica.inventarski_broj);
        DBMS_OUTPUT.PUT_LINE(' Naziv knjige: '||pozajmica.naziv);
    END LOOP;
    CLOSE trenutne_pozajmice;
END

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

DECLARE
    CURSOR spisak_clanova IS SELECT * FROM clanovi;
    CURSOR trenutne_pozajmice(p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE) IS
        SELECT datum_uzimanja, inventarski_broj, naziv
        FROM pozajmice JOIN primerci USING (inventarski_broj)
        JOIN knjige USING (id_knjige)
        WHERE broj_clanske_karte=p_broj_clanske_karte AND datum_vracanja IS NULL;
    v_broj_tren_pozajmica NUMBER;
BEGIN
    FOR clan IN spisak_clanova LOOP
        DBMS_OUTPUT.PUT_LINE('CLAN: '||clan.ime||' '||clan.prezime);
        SELECT COUNT(*) INTO v_broj_tren_pozajmica
        FROM pozajmice WHERE broj_clanske_karte=clan.broj_clanske_karte AND datum_vracanja IS NULL;
        IF v_broj_tren_pozajmica=0 THEN
        DBMS_OUTPUT.PUT_LINE(' Clan nema trenutne pozajmice');
        ELSE
        FOR pozajmica IN trenutne_pozajmice(clan.broj_clanske_karte) LOOP
            DBMS_OUTPUT.PUT_LINE(' Datum: '||pozajmica.datum_uzimanja);
            DBMS_OUTPUT.PUT_LINE(' Inventarski broj: '||pozajmica.inventarski_broj);
            DBMS_OUTPUT.PUT_LINE(' Naziv knjige: '||pozajmica.naziv);
        END LOOP;
        END IF;
    END LOOP;
END;
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+