Садржај
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 који пишемо као део процедуре или функције је дато раније у материјалима и по потреби је могуће вратити се на тај део да би се додатно разумело како смо дошли до комплетног решења.

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

../_images/slika_512a.jpg

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

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

../_images/slika_510a.jpg

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

Књиге издавача СЕТ са идентификационим бројем 2 су много тражене и библиотека жели да провери да ли има довољно наслова овог издавача у понуди.

На основу овог захтева има смисла формулисати неколико различитих задатка.

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

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

Написаћемо процедуру. Првим упитом узимамо идентификациони број издавача и уписујемо га у променљиву @id_izdavaca. Ту променљиву користимо у другом упиту да добијемо списак књига тог издавача.

CREATE PROCEDURE sve_knjige_izdavaca @naziv_izdavaca VARCHAR(40)
AS
    DECLARE @id_izdavaca INT;
    SELECT @id_izdavaca = id FROM izdavaci
    WHERE naziv = @naziv_izdavaca;
    SELECT naziv
    FROM knjige
    WHERE id_izdavaca = @id_izdavaca;

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

EXEC sve_knjige_izdavaca @naziv_izdavaca='CET'

Овај пример нема групну функцију, али нам служи да проверимо резултат рада наредног програма зато што можемо да приметимо у резултату да постоје две књиге овог издавача: „Veb programiranje “ и „PROGRAMIRANJE – klase i objekti“.

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

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

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

CREATE FUNCTION broj_knjiga_izdavaca (@naziv_izdavaca VARCHAR(40))
RETURNS INT
AS
BEGIN
    DECLARE @id_izdavaca INT;
    SELECT @id_izdavaca = id FROM izdavaci
    WHERE naziv = @naziv_izdavaca;
    DECLARE @broj_knjiga INT;
    SELECT @broj_knjiga = COUNT(knjige.naziv)
    FROM knjige
    WHERE id_izdavaca = @id_izdavaca;
    RETURN @broj_knjiga;
END

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

PRINT dbo.broj_knjiga_izdavaca('CET')

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

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

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

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

SELECT id_izdavaca, COUNT(id_knjige)
FROM knjige
GROUP BY id_izdavaca

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

CREATE PROCEDURE broj_knjiga_svakog_izdavaca
AS
SELECT id_izdavaca, COUNT(id_knjige) AS broj_knjiga
FROM knjige
GROUP BY id_izdavaca

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

EXEC broj_knjiga_svakog_izdavaca
../_images/slika_5110a.jpg

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

CREATE PROCEDURE broj_knjiga_svakog_izdavaca2
AS
DECLARE kursor_izdavaci CURSOR FOR
SELECT id, naziv FROM izdavaci;
DECLARE @id_izdavaca INT;
DECLARE @naziv_izdavaca VARCHAR(40);

OPEN kursor_izdavaci;
FETCH NEXT FROM kursor_izdavaci
INTO @id_izdavaca, @naziv_izdavaca;

WHILE @@FETCH_STATUS=0
BEGIN
    PRINT 'IZDAVAC: ' + @naziv_izdavaca;
    DECLARE @broj_knjiga INT;
    SELECT @broj_knjiga = COUNT(id_knjige)
    FROM knjige WHERE id_izdavaca = @id_izdavaca;
    PRINT 'Broj knjiga: ' + CAST(@broj_knjiga AS VARCHAR);
    FETCH NEXT FROM kursor_izdavaci
    INTO @id_izdavaca, @naziv_izdavaca;
END
CLOSE kursor_izdavaci;
DEALLOCATE kursor_izdavaci;

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

EXEC broj_knjiga_svakog_izdavaca2
../_images/slika_5110b.jpg

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

SELECT @broj_knjiga = COUNT(id_knjige)
FROM knjige WHERE id_izdavaca = @id_izdavaca;

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

@broj_knjiga = dbo.broj_knjiga_izdavaca(@naziv_izdavaca);

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

Најједноставније решење би било да укупан број књига поделимо са бројем издавача. Ова рачуница, међутим, нам можда неће дати добре информације зато што можда имамо у табели izdavaci податке о многим издавачима чије књиге немамо тренутно у понуди у библиотеци. Боље је да прођемо кроз списак свих издавача, па за оне издаваче за које имамо књиге увећамо неки бројач и саберемо књиге које имамо. На тај начин ћемо заиста видети просек књига по издавачима, али узимајући у обзир само оне издаваче чије књиге имамо у библиотеци.

CREATE PROCEDURE poredjenje_broja_knjiga_izdavaca @naziv_izdavaca VARCHAR(40)
AS
DECLARE @id_izdavaca INT;
DECLARE @broj_knjiga INT;
DECLARE kursor_izdavaci CURSOR FOR
SELECT id FROM izdavaci;
DECLARE @prosecan_broj INT = 0;
DECLARE @broj_izdavaca INT = 0;

OPEN kursor_izdavaci;
FETCH NEXT FROM kursor_izdavaci
INTO @id_izdavaca;

WHILE @@FETCH_STATUS=0
BEGIN
    SELECT @broj_knjiga = COUNT(id_knjige)
    FROM knjige WHERE id_izdavaca = @id_izdavaca;
    --samo ukoliko neki izdavac ima knjige
    --uvecavamo prosecan broj i prebrojavamo ga
    IF @broj_knjiga>0
    BEGIN
        SELECT @prosecan_broj = @prosecan_broj + @broj_knjiga;
        SELECT @broj_izdavaca = @broj_izdavaca + 1;
    END
    FETCH NEXT FROM kursor_izdavaci
    INTO @id_izdavaca;
END
CLOSE kursor_izdavaci;
DEALLOCATE kursor_izdavaci;

--prosecan broj knjiga po izdavacu za izdavace cije knjige imamo
SELECT @prosecan_broj = @prosecan_broj / @broj_izdavaca;

--broj knjiga izdavaca koji nas interesuje
SELECT @id_izdavaca = id
FROM izdavaci WHERE naziv = @naziv_izdavaca;
SELECT @broj_knjiga = COUNT(id_knjige)
FROM knjige WHERE id_izdavaca = @id_izdavaca;
PRINT 'Broj knjiga: ' + CAST(@broj_knjiga AS VARCHAR);

IF @broj_knjiga > @prosecan_broj
    PRINT 'Vec imamo vise knjiga od proseka po izdavacu';
ELSE
    PRINT 'Nemamo vise knjiga od proseka po izdavacu i mozemo da planiramo nabavku';

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

EXEC poredjenje_broja_knjiga_izdavaca @naziv_izdavaca = 'CET'
../_images/slika_5110c.jpg

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

EXEC poredjenje_broja_knjiga_izdavaca @naziv_izdavaca = 'Zavod za udzbenike'
../_images/slika_5110d.jpg
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+