Садржај
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 и наредба SELECT INTO – вежбање

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

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

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

../_images/slika_73a.jpg
  1. Приказати плату запосленог са идентификационим бројем 9.

DECLARE
    v_plata zaposleni.plata%TYPE;
BEGIN
    SELECT plata INTO v_plata
    FROM zaposleni WHERE id = 9;
    DBMS_OUTPUT.PUT_LINE('Trazena plata: '||v_plata);
END
  1. Приказати адресу и телефон члана библиотеке који се зове Оливера Стошић. Предвидети обраду изузетка уколико нема члана са тим именом и презименом, као и ситуацију уколико постоје два члана који се зову и презивају исто.

DECLARE
    v_adresa clanovi.adresa%TYPE;
    v_telefon clanovi.telefon%TYPE;
BEGIN
    SELECT adresa, telefon INTO v_adresa, v_telefon
    FROM clanovi WHERE ime='Olivera' AND prezime='Stosic';
    DBMS_OUTPUT.PUT_LINE('Adresa: '||v_adresa);
    DBMS_OUTPUT.PUT_LINE('Telefon: '||v_telefon);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Nema clana sa tim imenom');
    WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('Ima vise clanova sa istim imenom');
END

Други приступ са једном сложеном променљивом.

DECLARE
    v_podaci clanovi%ROWTYPE;
BEGIN
    SELECT * INTO v_podaci
    FROM clanovi WHERE ime='Olivera' AND prezime='Stosic';
    DBMS_OUTPUT.PUT_LINE('Adresa: '||v_podaci.adresa);
    DBMS_OUTPUT.PUT_LINE('Telefon: '||v_podaci.telefon);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Nema clana sa tim imenom');
    WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('Ima vise clanova sa istim imenom');
END
  1. Приказати адресу и веб-сајт издавача чији се назив уноси са тастатуре. Предвидети обраду изузетка уколико нема издавача са унетим називом.

DECLARE
    v_izdavac izdavaci%ROWTYPE;
    v_naziv izdavaci.naziv%TYPE;
BEGIN
    v_naziv := :naziv_izdavaca;
    SELECT * INTO v_izdavac
    FROM izdavaci WHERE UPPER(naziv)=UPPER(v_naziv);
    DBMS_OUTPUT.PUT_LINE('Adresa: '||v_izdavac.adresa);
    DBMS_OUTPUT.PUT_LINE('Veb sajt: '||v_izdavac.veb_sajt);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Nema izdavaca sa tim nazivom');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Greska');
END
  1. Приказати број примерака књиге са називом „PROGRAMIRANJE - klase i objekti“. Написати посебну поруку уколико у библиотеци постоји само један примерак.

DECLARE
    v_broj_primeraka NUMBER;
BEGIN
    SELECT COUNT(id_knjige) INTO v_broj_primeraka
    FROM knjige JOIN primerci USING(id_knjige)
    WHERE naziv = 'PROGRAMIRANJE - klase i objekti';
    IF v_broj_primeraka = 1 THEN
        DBMS_OUTPUT.PUT_LINE('U biblioteci postoji samo jedan primerak');
    ELSE
        DBMS_OUTPUT.PUT_LINE ('Broj primeraka: ' || v_broj_primeraka);
    END IF;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Doslo je do greske');
END
  1. Приказати број позајмица за члана чије се име и презиме уносе са тастатуре.

DECLARE
    broj NUMBER(5);
    v_ime clanovi.ime%TYPE;
    v_prezime clanovi.prezime%TYPE;
BEGIN
    v_ime := :ime_clana;
    v_prezime := :prezime_clana;
    SELECT COUNT(*) INTO broj
    FROM pozajmice JOIN clanovi USING (broj_clanske_karte)
    WHERE UPPER(ime) = UPPER(v_ime) AND UPPER(prezime) = UPPER(v_prezime);
    DBMS_OUTPUT.PUT_LINE('Broj pozajmica: '||broj);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Doslo je do greske');
END
  1. Приказати за члана са бројем чланске карте 33 број различитих издавача чије је књиге позајмљивао (уколико је члан читао више књига исте издавачке куће, тај издавач треба да се преброји само једном

DECLARE
    v_broj_izdavaca NUMBER;
BEGIN
    SELECT COUNT(DISTINCT id_izdavaca) INTO v_broj_izdavaca
    FROM pozajmice JOIN primerci USING (inventarski_broj)
    JOIN knjige USING (id_knjige)
    JOIN izdavaci ON izdavaci.id = knjige.id_izdavaca
    WHERE broj_clanske_karte = 33;
    DBMS_OUTPUT.PUT_LINE ('Broj izdavaca: '||v_broj_izdavaca);
EXCEPTION
    WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Nema takvog clana');
    WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Doslo je do greske');
END
  1. Приказати за члана који се зове Оливера Стошић колико година је члан библиотеке.

DECLARE
    broj INT;
BEGIN
    SELECT COUNT(*) INTO broj
    FROM clanarine JOIN clanovi USING (broj_clanske_karte)
    WHERE UPPER(ime)='OLIVERA' AND UPPER(prezime)='STOSIC';
    DBMS_OUTPUT.PUT_LINE('Broj godina: '||broj);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Greska!');
END
  1. Приказати број аутора књиге чији се назив уноси са тастатуре. Написати посебну поруку уколико књига има само једног аутора.

DECLARE
    broj NUMBER(1);
    v_naziv knjige.naziv%TYPE;
BEGIN
    v_naziv := :naziv_knjige;
    SELECT COUNT(*) INTO broj
    FROM autori JOIN autori_knjige USING(id_autora) JOIN knjige USING (id_knjige)
    WHERE naziv = v_naziv;
    IF broj = 1 THEN
        DBMS_OUTPUT.PUT_LINE('Knjiga ima jednog autora');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Broj autora: '||broj);
    END IF;
END
  1. Приказати број књигa чији је аутор Марко Видојковић.

DECLARE
    v_broj_knjiga NUMBER;
BEGIN
    SELECT COUNT(id_knjige) INTO v_broj_knjiga
    FROM autori JOIN autori_knjige USING (id_autora)
    WHERE ime = 'Marko' AND prezime = 'Vidojkovic';
    DBMS_OUTPUT.PUT_LINE(v_broj_knjiga);
END
  1. Приказати број позајмица примерака књига чији је аутор Марко Видојковић.

DECLARE
    broj NUMBER(5);
BEGIN
    SELECT COUNT(*) INTO broj FROM autori JOIN autori_knjige USING (id_autora)
    JOIN knjige USING (id_knjige) JOIN primerci USING (id_knjige)
    JOIN pozajmice USING (inventarski_broj)
    WHERE UPPER(ime) = 'MARKO' AND UPPER(prezime) = 'VIDOJKOVIC';
    DBMS_OUTPUT.PUT_LINE(broj);
END
  1. Приказати све податке о запосленом са идентификационим бројем 3. Приказати име и презиме његовог менаџера

DECLARE
    v_zaposleni zaposleni%ROWTYPE;
    v_menadzer VARCHAR2(50);
BEGIN
    SELECT * INTO v_zaposleni
    FROM zaposleni WHERE id=3;
    DBMS_OUTPUT.PUT_LINE('Ime: '||v_zaposleni.ime||' '||v_zaposleni.prezime);
    DBMS_OUTPUT.PUT_LINE('Mejl: '||v_zaposleni.mejl);
    DBMS_OUTPUT.PUT_LINE('Datum zaposlenja: '||v_zaposleni.datum_zaposlenja);
    DBMS_OUTPUT.PUT_LINE('Plata: '||v_zaposleni.plata);
    SELECT ime||' '||prezime INTO v_menadzer
    FROM zaposleni WHERE id=v_zaposleni.id_menadzera;
    DBMS_OUTPUT.PUT_LINE('Ime menadzera: '||v_menadzer);
END
  1. Приказати поруку да ли је просечна плата запослених у тиму менаџера са идентификационим бројем 5 већа од просечне плате свих запослених.

DECLARE
    v_prosek zaposleni.plata%TYPE;
    v_prosek_menadzer_5 zaposleni.plata%TYPE;
BEGIN
    SELECT AVG(plata) INTO v_prosek
    FROM zaposleni;
    SELECT AVG(plata) INTO v_prosek_menadzer_5
    FROM zaposleni WHERE id_menadzera=5;

    IF v_prosek_menadzer_5 > v_prosek THEN
    DBMS_OUTPUT.PUT_LINE('Tim 5 ima prosek plata veci od proseka svih zaposlenih');
    ELSE
    DBMS_OUTPUT.PUT_LINE('Tim 5 nema prosek plata veci od proseka svih zaposlenih');
    END IF;
END
  1. Приказати број запослених којима је менаџер са идентификационим бројем

DECLARE
    broj NUMBER(2);
BEGIN
    SELECT COUNT(id) INTO broj
    FROM zaposleni WHERE id_menadzera = 3;
    DBMS_OUTPUT.PUT_LINE('Broj zaposlenih u timu menadzera sa id 3: '||broj);
END
  1. Приказати име, презиме и имејл запосленог који зарађује највише. Предвидети обраду изузетка уколико има више запослених који имају исти, највећи износ плате.

DECLARE
    v_ime zaposleni.ime%TYPE;
    v_prezime zaposleni.prezime%TYPE;
    v_mejl zaposleni.mejl%TYPE;
BEGIN
    SELECT ime, prezime, mejl INTO v_ime, v_prezime, v_mejl
    FROM zaposleni WHERE plata = (SELECT MAX(plata) FROM zaposleni);
    DBMS_OUTPUT.PUT_LINE('Zaposleni koji zaradjuje najvise');
    DBMS_OUTPUT.PUT_LINE('Ime i prezime: '||v_ime||' '||v_prezime);
    DBMS_OUTPUT.PUT_LINE('Mejl: '||v_mejl);
    EXCEPTION
    WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('Postoji vise zaposlenih sa istim najvecim iznosom plate');
END

Друга опција са једном сложеном променљивом.

DECLARE
    v_zaposleni zaposleni%ROWTYPE;
BEGIN
    SELECT * INTO v_zaposleni
    FROM zaposleni WHERE plata = (SELECT MAX(plata) FROM zaposleni);
    DBMS_OUTPUT.PUT_LINE('Zaposleni koji zaradjuje najvise');
    DBMS_OUTPUT.PUT_LINE('Ime i prezime: '||v_zaposleni.ime||' '||v_zaposleni.prezime);
    DBMS_OUTPUT.PUT_LINE('Mejl: '||v_zaposleni.mejl);
    EXCEPTION
    WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('Postoji vise zaposlenih sa istim najvecim iznosom plate');
END
  1. Приказати презиме и имејл адресу менаџера запосленог чије се име и презиме уносе са тастатуре

DECLARE
    v_id_menadzera zaposleni.id_menadzera%TYPE;
    v_prezime_menadzera zaposleni.prezime%TYPE;
    v_mejl_menadzera zaposleni.mejl%TYPE;
    v_ime zaposleni.ime%TYPE;
    v_prezime zaposleni.prezime%TYPE;
BEGIN
    v_ime := :ime_zaposlenog;
    v_prezime := :prezime_zaposlenog;
    SELECT id_menadzera INTO v_id_menadzera
    FROM zaposleni WHERE UPPER(ime) = UPPER(v_ime) AND UPPER(prezime) = UPPER(v_prezime);
    SELECT prezime, mejl INTO v_prezime_menadzera, v_mejl_menadzera
    FROM zaposleni WHERE id = v_id_menadzera;
    DBMS_OUTPUT.PUT_LINE('Menadzer: '||v_prezime_menadzera);
    DBMS_OUTPUT.PUT_LINE('Mejl menadzera: '||v_mejl_menadzera);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Greska');
END
  1. Приказати број примерака књига које су тренутно издате. Приказати одговарајућу поруку уколико тренутно нема издатих књига.

DECLARE
 broj NUMBER(3);
BEGIN
    SELECT COUNT(*) INTO broj
    FROM pozajmice
    WHERE datum_vracanja IS NULL;
    IF broj = 0 THEN
        DBMS_OUTPUT.PUT_LINE('Nema trenutno izdatih knjiga.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Broj trenutno izdatih knjiga: '||broj);
    END IF;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Greska!');
END
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+