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

База података за библиотеку - Процедуре, функције и поређење различитих решења

Често исти проблем можемо да решимо на више различитих начина. Постоје ситуације када неки одређени приступ има више смисла од неког другог.

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

Програмски код, као и команде језика SQL, пише се и покреће када се кликне New Query након што се покрене систем SQL Server и кликне на креирану базу Biblioteka у прозору Object Explorer. Фајл са упитима SQLQuery1.sql може, а и не мора да се сачува.

Након што се унесе програмски код, кликне се на дугме Execute. Уколико се у простору за писање команди налази више блокова кода, потребно је обележити онај који желимо да покренемо. Ако имате више база података, обавезно проверите да ли је поред овог дугмета назив базе у којој желите да покрећете програме.

../_images/slika_521a.jpg

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

../_images/slika_521b.jpg

Вратимо се на пример да библиотека разматра да наручи још књига Завода за уџбенике. Да би донели ту одлуку, потребно је да се види колико су књиге овог издавача тражене.

Као што смо видели раније у материјалима, на основу овог захтева можемо да формирамо више задатака.

Задатак 1: Приказати укупан број позајмице књига датог издавача.

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

SELECT COUNT(*)
FROM pozajmice JOIN primerci
ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv='Zavod za udzbenike'

За овај проблем има највише смисла написати скаларну функцију која враћа број.

CREATE FUNCTION broj_pozajmica_izdavaca (@izdavac VARCHAR(40))
RETURNS INT
AS
BEGIN
    DECLARE @broj INT;
    SELECT @broj = COUNT(*)
    FROM pozajmice JOIN primerci
    ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
    JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
    JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
    WHERE izdavaci.naziv = @izdavac;
    RETURN @broj;
END

Следи позив функције.

PRINT dbo.broj_pozajmica_izdavaca ('Zavod za udzbenike')

Кад год библиотека размишља о набавци књига неког издавача, може да се позове ова функција која је сачувана у систему. На пример, можемо да је позовемо за издавача са називом CET.

PRINT dbo.broj_pozajmica_izdavaca ('CET')

Задатак 2: Приказати број позајмица сваке књиге датог издавача.

Овај извештај нам даје више података од претходног, зато што имамо јасан преглед и које књиге ове издавачке куће су тражене.

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

SELECT knjige.naziv, COUNT(*)
FROM pozajmice JOIN primerci
ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv='Zavod za udzbenike'
GROUP BY knjige.naziv

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

CREATE PROCEDURE pozajmice_knjiga_izdavaca @izdavac VARCHAR(40)
AS
SELECT knjige.naziv AS naziv_knjige, COUNT(*) AS broj_pozajmica
FROM pozajmice JOIN primerci
ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv=@izdavac
GROUP BY knjige.naziv

Позив процедуре за једног издавача.

EXEC pozajmice_knjiga_izdavaca @izdavac='Zavod za udzbenike'
../_images/slika_521c.jpg

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

EXEC pozajmice_knjiga_izdavaca @izdavac='CET'

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

CREATE PROCEDURE pozajmice_knjiga_izdavaca2 @izdavac VARCHAR(40)
AS
DECLARE kursor_knjige CURSOR FOR
SELECT knjige.naziv AS naziv_knjige
FROM knjige JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv=@izdavac;
DECLARE @naziv_knjige VARCHAR(50);

OPEN kursor_knjige;
FETCH NEXT FROM kursor_knjige
INTO @naziv_knjige;

WHILE @@FETCH_STATUS=0
BEGIN
    PRINT 'KNJIGA: '+@naziv_knjige;
    DECLARE @broj INT;
    SELECT @broj = COUNT(*) FROM
    pozajmice JOIN primerci
    ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
    JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
    WHERE naziv = @naziv_knjige;
    PRINT 'Broj pozajmica: '+CAST(@broj AS VARCHAR);

    FETCH NEXT FROM kursor_knjige
    INTO @naziv_knjige;
END;
CLOSE kursor_knjige;
DEALLOCATE kursor_knjige;

Следи позив ове процедуре.

EXEC pozajmice_knjiga_izdavaca2 @izdavac='Zavod za udzbenike'
../_images/slika_521d.jpg

Треће решење би било додатно проширење процедуре коју смо малопре видели. Када имамо на располагању и рад са курсорима, можемо за сваку књигу, не само да прикажемо број позајмица, већ и да прикажемо све позајмице. Користићемо још један курсор тако да се за сваку књигу прикаже списак датума позајмица. Приликом рада са тим курсором користићемо и променљиву @broj да редом обележавамо позајмице. Овај бројач се постави на један за сваку књигу и увећава се унутар циклуса за сваку позајмицу те књиге.

CREATE PROCEDURE pozajmice_knjiga_izdavaca3 @izdavac VARCHAR(40)
AS
DECLARE kursor_knjige CURSOR FOR
SELECT knjige.naziv AS naziv_knjige
FROM knjige JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv=@izdavac;
DECLARE @naziv_knjige VARCHAR(50);

OPEN kursor_knjige;
FETCH NEXT FROM kursor_knjige
INTO @naziv_knjige;

WHILE @@FETCH_STATUS=0
BEGIN
    PRINT 'KNJIGA: '+@naziv_knjige;

    DECLARE kursor_pozajmice CURSOR FOR
    SELECT datum_uzimanja FROM
    pozajmice JOIN primerci
    ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
    JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
    WHERE naziv = @naziv_knjige;
    DECLARE @datum_uzimanja DATE;

    OPEN kursor_pozajmice;
    FETCH NEXT FROM kursor_pozajmice
    INTO @datum_uzimanja;
    DECLARE @broj INT = 0;
    WHILE @@FETCH_STATUS=0
    BEGIN
        SELECT @broj = @broj + 1;
        PRINT ' '+CAST(@broj AS VARCHAR)+'. '+CAST(@datum_uzimanja AS VARCHAR);
        FETCH NEXT FROM kursor_pozajmice
        INTO @datum_uzimanja;
    END
    CLOSE kursor_pozajmice;
    DEALLOCATE kursor_pozajmice;

    FETCH NEXT FROM kursor_knjige
    INTO @naziv_knjige;
END;
CLOSE kursor_knjige;
DEALLOCATE kursor_knjige;

Следи позив процедуре.

EXEC pozajmice_knjiga_izdavaca3 @izdavac=’Zavod za udzbenike’

../_images/slika_521e.jpg

Задатак 3: Приказати за сваког издавача укупан број позајмица његових књига.

Овај извештај можемо да употребимо тако да видимо како стоји потражња књига Завода за уџбенике у односу на књиге других издавача.

Упит којим смо решили овај задатак.

SELECT izdavaci.naziv, COUNT(*)
FROM pozajmice JOIN primerci
ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
GROUP BY izdavaci.naziv

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

Прво решење је процедура у којој позивамо већ креирану функцију.

CREATE PROCEDURE broj_pozajmica_za_svakog_izdavaca
AS
SELECT izdavaci.naziv,
dbo.broj_pozajmica_izdavaca(izdavaci.naziv) AS broj_pozajmica
FROM izdavaci;

Следи позив процедуре.

EXEC broj_pozajmica_za_svakog_izdavaca

Друго решење може да буде процедура са курсором у којој такође позивамо ову функцију.

CREATE PROCEDURE broj_pozajmica_za_svakog_izdavaca2
AS
DECLARE kursor_izdavaci CURSOR FOR
SELECT naziv FROM izdavaci;
DECLARE @naziv VARCHAR(40);

OPEN kursor_izdavaci;
FETCH NEXT FROM kursor_izdavaci
INTO @naziv;

WHILE @@FETCH_STATUS=0
BEGIN
    PRINT 'IZDAVAC: '+@naziv;
    DECLARE @broj INT = dbo.broj_pozajmica_izdavaca(@naziv);
    PRINT ' Broj pozajmica: '+CAST(@broj AS VARCHAR);

    FETCH NEXT FROM kursor_izdavaci
    INTO @naziv;
END

CLOSE kursor_izdavaci;
DEALLOCATE kursor_izdavaci;

Следи позив процедуре.

EXEC broj_pozajmica_za_svakog_izdavaca2
../_images/slika_521f.jpg

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

CREATE PROCEDURE broj_pozajmica_za_svakog_izdavaca3
AS
DECLARE kursor_izdavaci CURSOR FOR
SELECT naziv FROM izdavaci;
DECLARE @naziv VARCHAR(40);

OPEN kursor_izdavaci;
FETCH NEXT FROM kursor_izdavaci
INTO @naziv;

WHILE @@FETCH_STATUS=0
BEGIN
    PRINT 'IZDAVAC: '+@naziv;

    DECLARE kursor_pozajmice CURSOR FOR
    SELECT datum_uzimanja FROM pozajmice JOIN primerci
    ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
    JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
    JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
    WHERE izdavaci.naziv = @naziv;
    DECLARE @datum_uzimanja DATE;

    OPEN kursor_pozajmice;
    FETCH NEXT FROM kursor_pozajmice INTO @datum_uzimanja;
    WHILE @@FETCH_STATUS=0
    BEGIN
        PRINT ' '+CAST(@datum_uzimanja AS VARCHAR);
        FETCH NEXT FROM kursor_pozajmice INTO @datum_uzimanja;
    END;
    CLOSE kursor_pozajmice;
    DEALLOCATE kursor_pozajmice;

    FETCH NEXT FROM kursor_izdavaci
    INTO @naziv;
END

CLOSE kursor_izdavaci;
DEALLOCATE kursor_izdavaci;

Следи позив процедуре.

EXEC broj_pozajmica_za_svakog_izdavaca3

Задатак 4: Приказати издавачке куће чије се књиге често позајмљују из библиотеке, тј. чији је број позајмица већи од три.

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

Упит којим смо решили овај задатак.

SELECT izdavaci.naziv, COUNT(*)
FROM pozajmice JOIN primerci
ON (pozajmice.inventarski_broj=primerci.inventarski_broj)
JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
GROUP BY izdavaci.naziv
HAVING COUNT(*)>3

Можемо да креирамо процедуру која позива раније креирану функцију.

CREATE PROCEDURE izdavaci_sa_vise_pozajmica
AS
SELECT izdavaci.naziv,
dbo.broj_pozajmica_izdavaca(izdavaci.naziv) AS broj_pozajmica
FROM izdavaci
WHERE dbo.broj_pozajmica_izdavaca(izdavaci.naziv)>3

Следи позив процедуре.

EXEC izdavaci_sa_vise_pozajmica

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

CREATE FUNCTION broj_pozajmica_za_svakog_izdavaca4 ()
RETURNS TABLE
AS
RETURN SELECT izdavaci.naziv,
dbo.broj_pozajmica_izdavaca(izdavaci.naziv) AS broj_pozajmica
FROM izdavaci;

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

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

SELECT * FROM broj_pozajmica_za_svakog_izdavaca4()
WHERE broj_pozajmica>3

Уколико можда желимо да подигнемо границу, и додатно проберемо издаваче према броју позајмица, можемо да покренемо други упит.

SELECT * FROM broj_pozajmica_za_svakog_izdavaca4()
WHERE broj_pozajmica>7

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

SELECT * FROM broj_pozajmica_za_svakog_izdavaca4()
WHERE broj_pozajmica<3
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+