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

Процедуре и команда INSERT

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

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

Упознаћемо се са начином писања процедура кроз примере.

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

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

../_images/slika_510a.jpg

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

Сетимо се програмског кода за креирање табеле autori.

CREATE TABLE autori
( id_autora INT PRIMARY KEY,
ime VARCHAR(15) NOT NULL,
prezime VARCHAR(15) NOT NULL )

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

Можемо да проверимо који су типови колона и у прозору Object Explorer као што је приказано на следећој слици.

../_images/slika_510c.jpg

Можемо да напишемо процедуру. Након што наведемо назив процедуре, у овом случају unos_autora, наводимо списак параметара. Процедура коју креирамо има три параметра @id_autora, @ime_autora и @prezime_autora, чији су типови података исти као типови података одговарајућих колона у табели autori. Као што може да се види у овом примеру, назив параметара креће са знаком @, након чега обично стоји назив колоне из базе података на коју се параметар односи. У примеру који следи, вредности параметара се редом уписују у одговарајуће колоне табеле autori, дакле у команди INSERT која је део процедуре се на месту конкретних вредности налазе ознаке параметара.

CREATE PROCEDURE unos_autora
@id_autora int, @ime_autora varchar(15), @prezime_autora varchar(15)
AS
INSERT INTO autori
VALUES (@id_autora, @ime_autora, @prezime_autora)

Након што кликнемо на дугме Execute, добијамо поруку да је команда успешно извршена. Можемо да видимо у прозору Object Explorer да се процедура појавила на списку.

../_images/slika_510d.jpg

Процедура се позива командом EXEC тако што се наведу конкретне вредности параметара.

EXEC unos_autora @id_autora=10, @ime_autora='Miodrag', @prezime_autora='Majic'

Након што се позове процедура, може да се види у табели autori да је додат нови ред са новим аутором.

../_images/slika_510e.jpg

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

Процедура се уклања из базе командом DROP.

DROP PROCEDURE unos_autora

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

CREATE PROCEDURE unos_autora @ime_autora varchar(15), @prezime_autora varchar(15)
AS
DECLARE @id_autora int;
SELECT @id_autora = MAX(id_autora) FROM autori;
INSERT INTO autori
VALUES (@id_autora+1, @ime_autora, @prezime_autora)

Пре него што креирамо процедуру, има смисла да је мало дорадимо и да додамо проверу да се нови аутор додаје само уколико није већ у бази. Пре него што кренемо у процес формирања новог идентификационог броја, исту променљиву @id_autora можемо прво да употребимо да проверимо да ли аутор већ постоји тако што ћемо у упиту SELECT у њу да прочитамо идентификациони број аутора датог имена и презимена. Уколико аутора нема у табели, вредност променљиве ће бити null и у том случају има смисла додавање реда. Уколико смо нашли идентификациони број аутора којег покушавамо да упишемо у базу, нема потребе да га поново додајемо. Наредба гранања почиње резервисаном речју IF, а ако има неколико команди које је потребно извршити у телу наредбе, неопходно је да се ставе између BEGIN и END.

CREATE PROCEDURE unos_autora @ime_autora varchar(15), @prezime_autora varchar(15)
AS
DECLARE @id_autora int;
SELECT @id_autora = id_autora FROM autori
WHERE ime=@ime_autora AND prezime=@prezime_autora;
IF @id_autora IS NULL
BEGIN
    SELECT @id_autora = MAX(id_autora) FROM autori;
    INSERT INTO autori
    VALUES (@id_autora+1, @ime_autora, @prezime_autora);
END

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

EXEC unos_autora @ime_autora='Danica', @prezime_autora='Vukicevic'

За попуњавање вредности у колони која је примарни кључ можемо да користимо и секвенцу. Секвенца је објекат у бази који служи да формира различите бројеве. Команда која следи креира секвенцу која почиње формирање бројева од 110 и сваки следећи је за један већи. Ову почетну вредност смо изабрали тако да је већа од бројева које у почетку имамо у колони id_autora у табели autori. Иначе је уобичајено да за секвенцу бројање почиње од јединице.

CREATE SEQUENCE novi_identifikacioni_broj
    START WITH 110
    INCREMENT BY 1;

Не морамо да бришемо и поново креирамо процедуру. Програмски код процедуре може да се измени када изаберемо ставку Modify са менија који се појави када кликнемо десни тастер миша над процедуром у прозору Object Explorer.

../_images/slika_510f.jpg

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

SELECT @id_autora = NEXT VALUE FOR novi_identifikacioni_broj;

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

../_images/slika_510g.jpg

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

EXEC unos_autora @ime_autora = 'Milena', @prezime_autora = 'Markovic'

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

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

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

../_images/slika_510h.jpg

Потребно је пронаћи идентификационе бројеве издавача и аутора ако они већ постоје у бази. Уколико не постоје, наћи ћемо највеће идентификационе бројеве у одговарајућим табелама и унећемо као нове за по један веће. Књигу сигурно додајемо. Иако су мале шансе, није немогуће да две књиге различитих аутора имају исти назив. Веома је важно да не заборавимо на крају да унесемо у табелу autori_knjige одговарајући пар идентификационих бројева id_autora и id_knjige.

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

CREATE PROCEDURE unos_romana @naziv varchar(50),
@ime_autora varchar(15), @prezime_autora varchar(15),
@izdavac varchar(40)
AS

DECLARE @id_autora int;
--proveravamo da li autor vec postoji
SELECT @id_autora = id_autora FROM autori
WHERE ime=@ime_autora AND prezime=@prezime_autora;
--dodajemo autora ako nije u bazi
IF @id_autora IS NULL
BEGIN
    SELECT @id_autora = (MAX(id_autora)+1) FROM autori;
    INSERT INTO autori
    VALUES (@id_autora, @ime_autora, @prezime_autora);
END

DECLARE @id_izdavaca int;
--proveravamo da li izdavac vec postoji
SELECT @id_izdavaca = id FROM izdavaci
WHERE naziv=@izdavac;
--dodajemo izdavaca ako nije u bazi
IF @id_izdavaca IS NULL
BEGIN
    SELECT @id_izdavaca = (MAX(id)+1) FROM izdavaci;
    INSERT INTO izdavaci
    VALUES (@id_izdavaca, @izdavac, null, null);
END

DECLARE @id_knjige int;
--dodajemo knjigu i odgovarajuci id izdavaca
SELECT @id_knjige = (MAX(id_knjige)+1) FROM knjige;
INSERT INTO knjige
VALUES (@id_knjige, @naziv, @id_izdavaca);
--povezujemo knjigu i autora
INSERT INTO autori_knjige
VALUES (@id_autora, @id_knjige);

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

EXEC unos_romana @naziv = 'Deca',
@ime_autora = 'Milena', @prezime_autora = 'Markovic', @izdavac = 'LOM'

Како смо аутора Милену Марковић већ додали у базу, овај позив процедуре ће додати три реда у преостале три табеле. На следећој слици се види садржај свих редова који се односе на новододату књигу у табелама, редом, autori, izdavaci, knjige и autori_knjige.

../_images/slika_510i.jpg

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

EXEC unos_romana @naziv = 'Unutrasnje more',
@ime_autora = 'Danica', @prezime_autora = 'Vukicevic', @izdavac = 'Futura publikacije'

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

EXEC unos_romana @naziv = 'Drame 2',
@ime_autora = 'Milena', @prezime_autora = 'Markovic', @izdavac = 'LOM'
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+