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

Процедуре и функције

Често је потребно да један програм више пута користимо, и то са различитим параметрима. На пример, видели смо примере програма у којима приказујемо тренутне позајмице за члана чији број чланске карте уносимо са тастатуре. Да не бисмо стално писали и покретали исти програмски код, постоји могућност да се он организује у именовану целину која ће остати запамћена у СУБП-у, и по потреби ће се само позивати. У језику PL/SQL постоје две врсте именованих подпрограма, а то су процедуре и функције.

Следе примери и објашњења како се пишу и позивају процедуре и функције, подпрограми написани у језику PL/SQL.

Програми се пишу у едитору у оквиру онлајн окружења Oracle APEX, а покрећу се кликом на дугме Run:

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

clanovi(broj_clanske_karte, ime, prezime, adresa, telefon, mejl_adresa)

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

Можемо да напишемо једноставан PL/SQL програм.

DECLARE
    v_clan VARCHAR2(150);
    v_telefon clanovi.telefon%TYPE;
BEGIN
    SELECT ime||' '||prezime, telefon INTO v_clan, v_telefon
    FROM clanovi WHERE broj_clanske_karte=22;
    DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_clan);
    DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
END

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

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

CREATE OR REPLACE PROCEDURE
    clan_podaci(p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE) AS
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
    v_telefon clanovi.telefon%TYPE;
BEGIN
    SELECT ime, prezime, telefon INTO v_ime, v_prezime, v_telefon
    FROM clanovi WHERE broj_clanske_karte=p_broj_clanske_karte;
    DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_ime||' '||v_prezime);
    DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
END

Када се кликне на дугме Run, добијамо поруку да је процедура креирана, на енглеском Procedure created. Могуће је да, након тестирања, треба да изменимо програмски код сачуване процедуре. Из тог разлога је згодно увек писати CREATE OR REPLACE приликом креирања процедуре, па уколико већ постоји, она ће бити обрисана и уместо ње ће се креирати нова, измењена. У том случају, не морамо ми да ручно бришемо процедуру пре него што креирамо нову верзију.

../_images/slika_91a.jpg

Процедура је запамћена у систему и можемо да је позовемо у једном или више различитих PL/SQL програма. Можемо да обришемо њен програмски код из едитора, и да напишемо следећи програм који ће процедуру да позове за број чланске карте 22.

BEGIN
    clan_podaci(22);
END

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

../_images/slika_91b.jpg

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

DECLARE
    CURSOR kursor_clanovi IS SELECT * FROM clanovi;
BEGIN
    FOR v_clan IN kursor_clanovi LOOP
        clan_podaci(v_clan.broj_clanske_karte);
    END LOOP;
END
../_images/slika_91c.jpg

Процедура не мора да исписује податке на екран. Тражени подаци могу да се врате програму из којег ће се процедура позвати кроз листу излазних параметара. За излазне параметре је неопходно написати реч OUT.

CREATE OR REPLACE PROCEDURE
    clan_podaci2(p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE,
    p_ime OUT clanovi.ime%TYPE, p_prezime OUT clanovi.prezime%TYPE,
    p_telefon OUT clanovi.telefon%TYPE) AS
BEGIN
    SELECT ime, prezime, telefon INTO p_ime, p_prezime, p_telefon
    FROM clanovi WHERE broj_clanske_karte=p_broj_clanske_karte;
END

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

DECLARE
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
    v_telefon clanovi.telefon%TYPE;
BEGIN
    clan_podaci2(22, v_ime, v_prezime, v_telefon);
    DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_ime||' '||v_prezime);
    DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
END

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

DECLARE
    CURSOR kursor_clanovi IS SELECT * FROM clanovi;
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
    v_telefon clanovi.telefon%TYPE;
BEGIN
    FOR v_clan IN kursor_clanovi LOOP
        clan_podaci2(v_clan.broj_clanske_karte, v_ime, v_prezime, v_telefon);
        DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_ime||' '||v_prezime);
        DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
    END LOOP;
END

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

DECLARE
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
    v_telefon clanovi.telefon%TYPE;
    v_broj_clanske_karte clanovi.broj_clanske_karte%TYPE;
BEGIN
    v_broj_clanske_karte := :BROJ_CLANSKE_KARTE;
    clan_podaci(v_broj_clanske_karte, v_ime, v_prezime, v_telefon);
    DBMS_OUTPUT.PUT_LINE('Ime i prezime clana: '||v_ime||' '||v_prezime);
    DBMS_OUTPUT.PUT_LINE('Telefon: '|| v_telefon);
END
../_images/slika_91d.jpg

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

../_images/slika_91e.jpg

Често грешке у писању подпрограма видимо тек када га позовемо у доста различитих ситуација. Јасно је да је потребно да додамо EXCEPTION блок.

CREATE OR REPLACE PROCEDURE
    clan_podaci2(p_broj_clanske_karte clanovi.broj_clanske_karte%TYPE,
    p_ime OUT clanovi.ime%TYPE, p_prezime OUT clanovi.prezime%TYPE,
    p_telefon OUT clanovi.telefon%TYPE) AS
BEGIN
    SELECT ime, prezime, telefon INTO p_ime, p_prezime, p_telefon
    FROM clanovi WHERE broj_clanske_karte=p_broj_clanske_karte;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Nema clana sa tim brojem clanske karte');
END

Када се покрене, нова процедура ће у систему заменити стару процедуру.

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

../_images/slika_91f.jpg

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

    CREATE OR REPLACE FUNCTION clanovi_fja(p_br clanovi.broj_clanske_karte%TYPE)
    RETURN clanovi%ROWTYPE AS
    podaci clanovi%ROWTYPE;
BEGIN
    SELECT * INTO podaci FROM clanovi
    WHERE broj_clanske_karte=p_br;
    RETURN podaci;
END

Када се кликне на дугме Run, добијамо поруку да је процедура креирана, на енглеском Function created. Функција је запамћена у систему и можемо да је позовемо у једном или више различитих PL/SQL програма. Можемо да обришемо њен програмски код из едитора, и да напишемо следећи програм који ће функцију да позове за број чланске карте 22. Када позивамо функцију, морамо да предвидимо променљиву којој ћемо да доделимо резултат рада функције, тако да се позив функције често налази као део у наредби доделе.

DECLARE
    v_clanovi clanovi%ROWTYPE;
BEGIN
    v_clanovi := clanovi_fja(22);
    DBMS_OUTPUT.PUT_LINE(v_clanovi.prezime);
END
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+