Садржај
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

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

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

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

../_images/slika_512a.jpg

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

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

../_images/slika_510a.jpg

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

SELECT COUNT(inventarski_broj)
FROM primerci JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv = 'CET'

Функција која ће садржати овај упит враћа цео број и мора да има помоћну променљиву у којoj ћемо привремено сачувати број примерака који прочитамо из базе. Параметре, у овом случају један параметар за назив издавача, стављамо у заграде. Цело тело функције пишемо између BEGIN и END. Након листе параметара, а пре тела функције је неопходно навести и тип података који функција враћа након речи RETURNS.

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

Након што се покрене овај програмски код, функција остаје сачувана у систему. Како функција враћа један број, она спада у групу скаларних функција (енг. scalar-valued functions).

../_images/slika_517a.jpg

Функције се другачије позивају од процедура. Како функција враћа једну вредност, може директно да се употреби у наредби PRINT и да се та вредност прикаже у прозору Messages. Унутар СУБП-а имамо много већ готових и доступних функција. Једну од њих, функцију COUNT, управо смо и употребили. Због тога је важно да се при позиву функције коју смо ми креирали, обавезно наведе назив шеме испред назива функције. То исто може да се уради и у позиву процедуре, али није неопходно. Шема је тренутни простор у којем се ради и у којем се налазе све табеле и сви остали објекти релационе базе података. У овом случају је назив шеме dbo.

PRINT dbo.broj_primeraka_izdavaca('CET')

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

DECLARE @broj INT = dbo.broj_primeraka_izdavaca('CET');
PRINT @broj;

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

../_images/slika_517b.jpg

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

DECLARE kursor_izdavaci CURSOR FOR
SELECT * FROM izdavaci;
DECLARE @id INT;
DECLARE @naziv VARCHAR(40);
DECLARE @adresa VARCHAR(50);
DECLARE @veb_sajt VARCHAR(50);

OPEN kursor_izdavaci;
FETCH NEXT FROM kursor_izdavaci INTO @id, @naziv, @adresa, @veb_sajt;

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'IZDAVAC: ' + @naziv;
    PRINT '  id = ' + CAST(@id AS VARCHAR(10));
    IF @adresa IS NOT NULL
        PRINT '  Adresa: ' + @adresa;
    IF @veb_sajt IS NOT NULL
        PRINT '  Veb sajt: ' + @veb_sajt;
    PRINT '  Broj primeraka: ' + CAST(dbo.broj_primeraka_izdavaca(@naziv) AS VARCHAR(10));
    FETCH NEXT FROM kursor_izdavaci INTO @id, @naziv, @adresa, @veb_sajt;
END

CLOSE kursor_izdavaci;
DEALLOCATE kursor_izdavaci;

Када се кликне се на дугме Execute, у прозору Messages се приказује комплетан списак. Употребили смо наредбу гранања да се не приказују редови вишка уколико немамо унету адресу или веб-сајт неког издавача.

Постоји још једна врста функција које можемо да креирамо. То су функције које враћају табеле (енг. table-valued functions).

За исти проблем којим смо се већ бавили можемо као решење да напишемо функцију која ће за једног издавача да формира и врати табелу у којој се налазе подаци о свим примерцима књига тог издавача. Након листе параметара, а пре тела функције је неопходно навести RETURNS TABLE.

CREATE FUNCTION spisak_primeraka_izdavaca (@izdavac VARCHAR(40))
RETURNS TABLE
AS
RETURN SELECT inventarski_broj, knjige.naziv
FROM primerci JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
WHERE izdavaci.naziv = @izdavac;

Након што се покрене овај програмски код, функција остаје сачувана у систему. Функцију која враћа табелу можемо да употребимо у упиту SELECT.

SELECT *
FROM spisak_primeraka_izdavaca('Zavod za udzbenike')

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

../_images/slika_517c.jpg

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

CREATE FUNCTION broj_primeraka_knjiga_izdavaca()
RETURNS TABLE
AS
RETURN SELECT izdavaci.naziv AS naziv_izdavaca,
knjige.naziv AS naziv_knjige, COUNT(inventarski_broj) AS broj_primeraka
FROM primerci JOIN knjige ON (primerci.id_knjige=knjige.id_knjige)
JOIN izdavaci ON (knjige.id_izdavaca=izdavaci.id)
GROUP BY izdavaci.naziv, knjige.naziv;

Након што се покрене овај програмски код, функција остаје сачувана у систему и можемо да је употребимо у упиту SELECT.

SELECT *
FROM broj_primeraka_knjiga_izdavaca()

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

../_images/slika_517d.jpg

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

SELECT naziv_knjige, broj_primeraka
FROM broj_primeraka_knjiga_izdavaca()
WHERE naziv_izdavaca = 'Laguna'

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

../_images/slika_517e.jpg
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+