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

Процедуре и функције са упитом и групним функцијама и подупитима - вежбање

Решити следеће задатке писањем процедуре или функције и програмског кода у којем се креирана процедура или функција позива.

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

Детаљно објашњење формирања упита SELECT који треба да буде део процедуре или функције је дато раније у материјалима и по потреби је могуће вратити се на тај део као помоћ у писању комплетног решења.

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

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

../_images/slika_521a.jpg

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

../_images/slika_521b.jpg
  1. Разматра се могућност да се уведу одређена ограничења члановима библиотеке који нередовно враћају књиге. Једна од мера би можда била да се њима не издају ретке књиге које су често тражене, а драстичнија мера би могла да подразумева и укидање чланства. Да би се на добар начин донела одлука, библиотека је одлучила да пажљиво проучи списак чланова који касне са враћањем књига и због тога плаћају казне да би се видело колико има таквих чланова и да ли има неких међу њима који се баш истичу.

Задатак 1: Приказати број до сада плаћених казни и укупан износ.

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

SELECT COUNT(*) "Broj kazni", SUM(iznos) "Ukupan iznos"
FROM kazne

Прво решење – процедура.

CREATE PROCEDURE kazne_info
AS
SELECT COUNT(*) AS broj_kazni, SUM(iznos) AS ukupan_iznos
FROM kazne

Позив процедуре.

EXEC kazne_info

Друго решење – две функције.

CREATE FUNCTION broj_kazni()
RETURNS INT
AS
BEGIN
DECLARE @broj INT;
SELECT @broj = COUNT(*) FROM kazne;
RETURN @broj;
END

CREATE FUNCTION ukupan_iznos_kazni()
RETURNS INT
AS
BEGIN
DECLARE @broj INT;
SELECT @broj = SUM(iznos) FROM kazne;
RETURN @broj;
END

Позив функција.

PRINT 'Broj kazni: '+CAST(dbo.broj_kazni() AS VARCHAR);
PRINT 'Ukupan iznos: '+CAST(dbo.ukupan_iznos_kazni() AS VARCHAR);

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

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

SELECT COUNT(DISTINCT broj_clanske_karte)
FROM kazne

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

CREATE FUNCTION broj_clanova_sa_kaznama()
RETURNS INT
AS
BEGIN
DECLARE @broj INT;
SELECT @broj = COUNT(DISTINCT broj_clanske_karte)
FROM kazne;
RETURN @broj;
END

Позив функције.

PRINT dbo.broj_clanova_sa_kaznama()

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

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

SELECT ime, prezime, COUNT(*)
FROM kazne JOIN clanovi
ON (kazne.broj_clanske_karte=clanovi.broj_clanske_karte)
GROUP BY ime, prezime
ORDER BY ime, prezime

Прво решење – процедура.

CREATE PROCEDURE clanovi_kazne
AS
SELECT ime, prezime, COUNT(*) AS broj_kazni
FROM kazne JOIN clanovi
ON (kazne.broj_clanske_karte=clanovi.broj_clanske_karte)
GROUP BY ime, prezime
ORDER BY ime, prezime

Позив процедуре.

EXEC clanovi_kazne
../_images/slika_525a.jpg

Друго решење – лепше форматиран приказ тражених података.

CREATE PROCEDURE clanovi_kazne2
AS
DECLARE kursor_clanovi CURSOR FOR
SELECT DISTINCT broj_clanske_karte FROM kazne;
DECLARE @broj_clanske_karte INT;

OPEN kursor_clanovi;
FETCH NEXT FROM kursor_clanovi
INTO @broj_clanske_karte;

WHILE @@FETCH_STATUS=0
BEGIN
    DECLARE @ime VARCHAR(15);
    DECLARE @prezime VARCHAR(15);
    SELECT @ime=ime, @prezime=prezime
    FROM clanovi WHERE broj_clanske_karte=@broj_clanske_karte;
    PRINT 'CLAN: '+@ime+' '+@prezime;
    DECLARE @broj_kazni INT;
    SELECT @broj_kazni = COUNT(*)
    FROM kazne WHERE broj_clanske_karte=@broj_clanske_karte;
    PRINT 'Broj kazni: '+CAST(@broj_kazni AS VARCHAR);

    FETCH NEXT FROM kursor_clanovi
    INTO @broj_clanske_karte;
END
CLOSE kursor_clanovi;
DEALLOCATE kursor_clanovi;

Позив процедуре.

EXEC clanovi_kazne2
../_images/slika_525b.jpg

Задатак 4: Приказати имена и презимена чланова, уз број плаћених казни, који имају више од једне плаћене казне.

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

SELECT ime, prezime, COUNT(*)
FROM kazne JOIN clanovi
ON (kazne.broj_clanske_karte=clanovi.broj_clanske_karte)
GROUP BY ime, prezime
HAVING COUNT(*)>1
ORDER BY ime, prezime

Процедура са курсором.

CREATE PROCEDURE clanovi_kazne3
AS
DECLARE kursor_clanovi CURSOR FOR
SELECT DISTINCT broj_clanske_karte FROM kazne;
DECLARE @broj_clanske_karte INT;

OPEN kursor_clanovi;
FETCH NEXT FROM kursor_clanovi
INTO @broj_clanske_karte;

WHILE @@FETCH_STATUS=0
BEGIN
    DECLARE @broj_kazni INT;
    SELECT @broj_kazni = COUNT(*)
    FROM kazne WHERE broj_clanske_karte=@broj_clanske_karte;

    IF @broj_kazni>1
    BEGIN
        DECLARE @ime VARCHAR(15);
        DECLARE @prezime VARCHAR(15);
        SELECT @ime=ime, @prezime=prezime
        FROM clanovi WHERE broj_clanske_karte=@broj_clanske_karte;
        PRINT 'CLAN: '+@ime+' '+@prezime;
        PRINT 'Broj kazni: '+CAST(@broj_kazni AS VARCHAR);
    END;

    FETCH NEXT FROM kursor_clanovi
    INTO @broj_clanske_karte;
END
CLOSE kursor_clanovi;
DEALLOCATE kursor_clanovi;

Позив процедуре.

EXEC clanovi_kazne3

Задатак 5: Приказати име и презиме члана који је платио највећи износ казне до сада.

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

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

SELECT DISTINCT ime, prezime
FROM kazne JOIN clanovi
ON (kazne.broj_clanske_karte=clanovi.broj_clanske_karte)
WHERE iznos = (SELECT MAX(iznos) FROM kazne)

Функција која враћа највећи износ плаћење казне.

CREATE FUNCTION najveca_placena_kazna ()
RETURNS INT
AS
BEGIN
DECLARE @iznos INT;
SELECT @iznos = MAX(iznos) FROM kazne;
RETURN @iznos;
END

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

CREATE PROCEDURE clan_sa_najvecom_kaznom
AS
SELECT DISTINCT ime, prezime
FROM kazne JOIN clanovi
ON (kazne.broj_clanske_karte=clanovi.broj_clanske_karte)
WHERE iznos = dbo.najveca_placena_kazna();

Позив процедуре.

EXEC clan_sa_najvecom_kaznom
  1. У току месеца маја је акција и библиотека поклања по једну књигу својим верним члановима који тог месеца дођу да позајме књиге. Тренутно је у библиотеку дошла Милица Зорановић и библиотекар жели да провери како изгледа њена историја чланства, тј. да ли је већ дужи низ година члан библиотеке.

Задатак: Приказати број година када је члан датог имена и презимена био члан библиотеке, тј. године за које је платио чланарину.

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

SELECT COUNT(god)
FROM clanovi JOIN clanarine
ON (clanovi.broj_clanske_karte=clanarine.broj_clanske_karte)
WHERE ime='Milica' AND prezime='Zoranovic'

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

CREATE FUNCTION broj_godina_clanstva (@ime VARCHAR(15), @prezime VARCHAR(15))
RETURNS INT
AS
BEGIN
    DECLARE @broj INT;
    SELECT @broj = COUNT(god)
    FROM clanovi JOIN clanarine
    ON (clanovi.broj_clanske_karte=clanarine.broj_clanske_karte)
    WHERE ime=@ime AND prezime=@prezime;
    RETURN @broj;
END

Позив функције.

PRINT dbo.broj_godina_clanstva('Milica', 'Zoranovic')

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

PRINT dbo.broj_godina_clanstva('Olivera', 'Stosic')
  1. Тренутно се размишља о корекцији износа за чланарине и корекцији попуста у ситуацијама где се остварује попуст на чланарину. Да би се донела добра одлука, потребно је проучити како се кретао износ просечне чланарине до сада.

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

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

SELECT AVG(iznos) FROM clanarine

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

CREATE FUNCTION prosecna_clanarina()
RETURNS INT
AS
BEGIN
    DECLARE @iznos INT;
    SELECT @iznos = AVG(iznos) FROM clanarine;
    RETURN @iznos;
END

Позив функције.

PRINT dbo.prosecna_clanarina()

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

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

SELECT god, AVG(iznos)
FROM clanarine
GROUP BY god

Процедура.

CREATE PROCEDURE prosecna_clanarina_po_god
AS
SELECT god, AVG(iznos)
FROM clanarine
GROUP BY god

Позив процедуре.

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