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

Креираћемо у окружењу Visual Studio рачунарски програм који издваја податке из једне табеле креиране базе података употребом угњежденог упита SELECT.

Програми се пишу у развојном окружењу Visual Studio Community и помоћу програмког језика C#.

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

Када се покрене развојно окружење Visual Studio Community, потребно је да се креира нови пројекат избором опције Create a new project. Изабрани језик треба да буде С#, а врста пројекта Windows Forms App, апликација са графичким коирсничким интерфејсом.

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

Први корак је додавање раније креиране базе података новом пројекту. У прозору Solution Explorer је потребно да се кликне десни тастер миша над називом пројекта, а затим да се изабере Add/Existing Item… са менија који се појави. База података коју смо креирали се већ налази на рачунару и потребно је пронаћи и изабрати фајл Biblioteka_knjige.mdf у којем је сачувана. Тачна локација може да се провери у систему SQL Server Management Studio у којем смо креирали базу.

../_images/slika_35a.jpg

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

Потребно је да додамо и једно дугме, контролну Button, за прву опцију коју ћемо имати у нашем програму, а то је приказ комплетног садржаја табеле knjige. У прозору Properties изменимо својство Text за дугме тако да на дугмету пише текст који одговара радњи која ће да се догоди када се на дугме кликне.

../_images/slika_35b.jpg

Комплетан дизајн апликације може да се види на следећој слици.

../_images/slika_35c.jpg

За разлику од претходних примера, садржај објекта DataGridView ћемо попунити наредбама програмског језика C#.

Класе које су нам потребне за читање података из базе и њихов приказ у програму се налазе у именском простору System.Data.SqlClient који није аутоматски укључен у нови пројекат. Потребно је да додамо следећи ред на врх документа са програмским кодом који добијамо када урадимо двоклик на дугме.

using System.Data.SqlClient;

Овај ред може да се дода и на крај постојећег низа са наредбама using, а можемо и да га додамо и након додавања именског простора System.Data који је већ укључен у празан пројекат.

../_images/slika_35d.jpg

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

Стринг који сте добили није идентичан овоме који је овде приказан. Значајно је да сте запамтили конекциони стринг који сте ви добили на вашем рачунару за вашу базу података. Тај стринг ће се користити и у свим наредним програмима које креирамо и који се повезују на ову базу података. У првом примеру програмског кода који следи ће бити приказан један конекциони стринг, а касније ће свуда писати само KONEKCIONI_STRING на местима где треба да убаците ваш конекциони стринг.

За повезивање са базом података нам је потребан објекат класе SqlDataAdapter. Приликом креирања тог објекта наводимо упит SELECT, у овом случају упит који приказује комплетан садржај табеле knjige, и конекциони стринг. Креирани објекат ћемо употребити да попунимо објекат класе DataTable који директно можемо да упишемо у постављени DataGridView. Имамо могућност да на различите начине именујемо објекте које креирамо, а у свим примерима који следе ћемо се придржавати правила именовања да је назив објекта скраћеница назива класе на енглеском језику.

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

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

SqlDataAdapter da;
DataTable dt;
string conText = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=" +
"C:\\Users\\Dusa\\Documents\\SQL Server Management Studio\\Biblioteka_knjige.mdf;" +
"Integrated Security=True;Connect Timeout=30";

    private void button1_Click(object sender, EventArgs e)
    {
        da = new SqlDataAdapter("SELECT * FROM knjige", conText);
        dt = new DataTable();
        da.Fill(dt);
        dataGridView1.DataSource = dt;
    }

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

../_images/slika_35e.jpg

Има више начина да постигнемо исти резултат, што је честа ситуација у програмирању. Следи другачији програмски код где смо креирали објекат класе SqlCommand. Приликом креирања овог објекта неопходан је текст упита, али и објекат SqlConnection који се креира на основу конекционог стринга. Помоћу својства SelectCommand креирани упит додељујемо објекту класе SqlDataAdapter, након чега следе кораци као и у претходној варијанти решења.

    private void button1_Click(object sender, EventArgs e)
        {
            da = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("SELECT * FROM knjige", new SqlConnection(con));
            da.SelectCommand = cmd;
            dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;
        }

Више о класама SqlConnection и SqlCommand може да се нађе у званичној документацији на интернету.

Све је спремно да се покрене апликација кликом на дугме Start и да се тестира прва опција коју смо испрограмирали.

../_images/slika_35f.jpg

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

../_images/slika_35g.jpg

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

База података за библиотеку коју користимо нема превелики број података. Најчешће у базама имамо табеле са јако великим бројем редова и није могуће да све податке из табеле повучемо у програм. Из тог разлога можемо да ограничимо број редова из којих узимамо податке користећи у упиту TOP уз навођење броја редова који нам је потребан.

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

Следећи упит узима само податке о првих пет књига и могли смо да га употребимо уместо упита који враћа цео садржај табеле.

SELECT TOP 5 * FROM knjige

Наставићемо рад на нашем програму. Потребно је да се вратимо на картицу Form1.cs [Design] и да дорадимо дизајн за следећи део програма. Из помоћног прозора Toolbox превучемо један GroupBox и у њега ставимо један TextBox за унос идентификационог броја и дугме за приказ података о књизи са тим бројем.

../_images/slika_35h.jpg

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

private void button2_Click(object sender, EventArgs e)
    {
        int id_knjige = int.Parse(textBox1.Text);
        string cmd = "SELECT * FROM knjige WHERE id_knjige=" + id_knjige;
        da = new SqlDataAdapter(cmd, con);
        dt = new DataTable();
        da.Fill(dt);
        dataGridView1.DataSource = dt;
    }

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

../_images/slika_35i.jpg

Програм можемо да зауставимо тако што затворимо прозор у којем је покренут и вратимо се у развојно окружење. Потребно је да се вратимо на картицу Form1.cs [Design] и да дорадимо дизајн за следећи део програма. Из помоћног прозора Toolbox превучемо један GroupBox и у њега ставимо један TextBox за унос назива књига. Како корисник буде уносио текст у поље за унос текста, тако ће се филтирати списак књига и приказиваће се оне које имају унети текст као део назива.

../_images/slika_35j.jpg

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

private void textBox2_TextChanged(object sender, EventArgs e)
    {
        if (textBox2.Text != string.Empty)
        {
            string naziv = textBox2.Text;
            string cmd = "SELECT * FROM knjige WHERE naziv LIKE '%" + naziv + "%'";
            da = new SqlDataAdapter(cmd, con);
            dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;
        }
    }

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

../_images/slika_35k.jpg ../_images/slika_35l.jpg

Уколико је упит дугачак, добро је да се преломи у неколико редова. Најбољи начин да се то уради је да се упит прво цео напише у једном реду са знацима навода на почетку и крају. Затим се позиционирати на место где желимо да поделимо упит на два реда, на пример непосредно испред речи FROM. Када се кликне на ентер, окружење ће само да правилно подели стринг на два. Исто може да се понови и испред речи WHERE. Важно је да се обрати пажња да у стрингу у којем се налази упит имамо све размаке који раздвајају кључне речи и називе колона и табела.

../_images/slika_35m.jpg

Приликом рада програма, тј. апликације, може да дође до разних грешака и потенцијалног пуцања програма. Да би се то спречило, неопходно је да се користи try-catch блок. Сваки блок кода који смо писали треба да се убаци унутар try дела, а порука о грешци се исписује у catch блоку. Следи поправљен програмски код догађаја везаног за друго дугме.

private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            int id_knjige = int.Parse(textBox1.Text);
            string upit = "SELECT * FROM knjige WHERE id_knjige=" + id_knjige;
            da = new SqlDataAdapter(upit, con);
            dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.Message);
        }
    }

Блок try-catch треба увек да се пише, а изостављен је у многим примерима који следе само због укупне дужине програмских кодова који су приказани.

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