dbs_i – pl/sql
DESCRIPTION
DBS_I – PL/SQL. Vojtěch Hemala ARI. 1/ ZALOZTE SI NASLEDUJICI TABULKY A NAPLNTE JE DATY PODLE VZORU. INSERT INTO funkce (nazev) VALUES ('Vedouci'); INSERT INTO funkce (nazev) VALUES ('Skladnik'); . . . END ;. CREATE table "FUNKCE" ( "ID_F" NUMBER, "NAZEV" VARCHAR2(4000), - PowerPoint PPT PresentationTRANSCRIPT
DBS_I – PL/SQL
Vojtěch Hemala ARI
1/ ZALOZTE SI NASLEDUJICI TABULKY A NAPLNTE JE DATY PODLE VZORU
INSERT INTO brew (jmeno) VALUES ('Litovel');INSERT INTO brew (id_p,jmeno) VALUES ( 'Holba'); INSERT INTO brew (id_p,jmeno) VALUES ('Branik'); . . . END;
INSERT INTO funkce (nazev) VALUES ('Vedouci');INSERT INTO funkce (nazev) VALUES ('Skladnik'); . . . END;
INSERT INTO emp(id_zam,prijmeni,vek,prace,prislusnost,jmeno,plat) VALUES ( 'Konecny',35,3,104,'Karel',15200); INSERT INTO emp(id_zam,prijmeni,vek,prace,prislusnost,jmeno,plat) VALUES ('Prisoudil',42,1,106,'Jiri',13600); INSERT INTO emp(id_zam,prijmeni,vek,prace,prislusnost,jmeno,plat) VALUES ( 'Kvapil',38,2,108,'Petr',14800); INSERT INTO emp(id_zam,prijmeni,vek,prace,prislusnost,jmeno,plat) VALUES ( 'Zabransky',53,4,109,'Pavel',16000); INSERT INTO emp(id_zam,prijmeni,vek,prace,prislusnost,jmeno,plat) VALUES ('Volejnik',46,5,105,'Milan',11300);. . .END;
CREATE table "FUNKCE" ( "ID_F" NUMBER, "NAZEV" VARCHAR2(4000), constraint "FUNKCE_PK" primary key ("ID_F"))
CREATE table "BREW" ( "ID_P" NUMBER, "JMENO" VARCHAR2(4000), constraint "BREW_PK" primary key ("ID_P"))
CREATE table "EMP" ( "ID_ZAM" NUMBER, "PRIJMENI" VARCHAR2(4000), "VEK" NUMBER, "PRACE" NUMBER, "PRISLUSNOST" NUMBER, "JMENO" VARCHAR2(4000), "PLAT" NUMBER, constraint "EMP_PK" primary key ("ID_ZAM"))
ALTER TABLE "EMP" ADD CONSTRAINT "EMP_FK" FOREIGN KEY ("PRACE")REFERENCES "FUNKCE" ("ID_F")ON DELETE SET NULL
ALTER TABLE "EMP" ADD CONSTRAINT "EMP_FK2" FOREIGN KEY ("PRISLUSNOST")REFERENCES "BREW" ("ID_P")ON DELETE SET NULL
2/ VYPIS CELEHO JMENA ZAMESTNANCE PIVOVARU
Napiste funkci cele_jmeno, jejiz vstupnim parametrem bude id zamestnance a ktera bude vracet cele jmeno zamestnance (podobnou funkci jste jiz na cviceni vytvareli!).
CREATE OR REPLACE FUNCTION cele_jmeno(p_id IN INTEGER) RETURN VARCHAR2 ASv_emp_name VARCHAR2(100);v_false brew.jmeno%TYPE :='Zadany zamestnanec neexistuje';
BEGIN BEGIN SELECT jmeno ||' '|| prijmeni INTO v_emp_name FROM emp WHERE id_zam=p_id; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN v_false; END;RETURN v_emp_name;END;
3/FUNKCE VRACEJICI POCET ZAMESTNANCU PIVOVARU
Napiste funkci, jejiz vstupnim parametrem bude nazev pivovaru a kterábude vracet pocet jeho zamestnancu. Funkce se bude jmenovat pocet_zamcu.
CREATE OR REPLACE FUNCTION pocet_zamcu(p_nazev IN VARCHAR2) RETURN VARCHAR2 ASv_pocet_zam VARCHAR2(50);v_pom NUMBER;v_false brew.jmeno%TYPE := 'Zadany pivovar neexistuje';
BEGIN SELECT count(*) INTO v_pom FROM emp e JOIN brew b ON e.prislusnost=b.id_p WHERE b.jmeno = INITCAP(p_nazev); v_pocet_zam := TO_CHAR(v_pom); IF v_pom >= 1 THEN RETURN v_pocet_zam; ELSE RETURN v_false; END IF;END;
4/ FUNKCE VRACEJICI NAZEV PIVOVARU, POCET VYSKYTUJICICH SE FUNKCI A PRUMERNY PLAT
CREATE OR REPLACE FUNCTION piv_stat(p_id_pivovaru IN brew.id_p%TYPE) RETURN VARCHAR2 ASv_nazev_piv VARCHAR2(50);v_funkce VARCHAR2(200);v_plat emp.plat%TYPE;v_jmeno VARCHAR2(200);v_pom VARCHAR2(50);v_false brew.jmeno%TYPE := 'Zadany pivovar nenalezen';cursor c_emp ISSELECT DISTINCT f.nazev FROM funkce f INNER JOIN emp e ON e.prace=f.id_f WHERE e.prislusnost=p_id_pivovaru;
BEGIN v_funkce := ' --> pozice: '; BEGIN SELECT jmeno INTO v_nazev_piv FROM brew WHERE id_p=p_id_pivovaru; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN v_false; END;
Napiste funkci, jejiz vstupnim parametrem bude id pivovaru a ktera bude vracet jeho nazev, nazvy funkci, ktere se v pivovaru vyskytuji (kazdou funkci jen jednou!), a prumerny plat v danem pivovaru. Funkce se bude jmenovat piv_stat.
v_jmeno := 'Nazev pivovaru: '|| v_nazev_piv; SELECT ROUND(AVG(plat)) INTO v_plat FROM emp WHERE prislusnost=p_id_pivovaru;OPEN c_emp; LOOP FETCH c_emp INTO v_pom; EXIT WHEN c_emp%NOTFOUND; IF c_emp%ROWCOUNT = 1 THEN v_funkce := v_funkce||v_pom; ELSE v_funkce := v_funkce||', '||v_pom; END IF; END LOOP;CLOSE c_emp;v_jmeno:=v_jmeno||v_funkce||' --> prumernu plat: '||v_plat;RETURN v_jmeno;END;
5/ PROCEDURA S PARAMETRICKYM KURZOREM
CREATE OR REPLACE PROCEDURE emp_info(p_nazev_fce IN VARCHAR2) ASv_fce NUMBER;v_false brew.jmeno%TYPE := 'Zadana funkce neexistuje';cursor c_emp(p_fce IN NUMBER) IS SELECT e.jmeno,e.prijmeni,e.vek,e.plat FROM emp e JOIN funkce f ON e.prace=f.id_f WHERE f.id_f=p_fce;
BEGINDBMS_OUTPUT.PUT_LINE('Vypis osob s funkci: '||INITCAP(p_nazev_fce)); BEGIN SELECT id_f INTO v_fce FROM funkce WHERE nazev=INITCAP(p_nazev_fce); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(v_false); END;FOR info IN c_emp(v_fce) LOOP DBMS_OUTPUT.PUT_LINE('Jmeno: '||info.jmeno||' '||info.prijmeni||', Plat: '||info.plat ||', Vek: '||info.vek); EXIT WHEN c_emp%NOTFOUND;END LOOP;END;
6/ PROCEDURA S VKLADANIM
CREATE OR REPLACE PROCEDURE zaloz_zamce(p_prijmeni IN VARCHAR2, p_jmeno IN VARCHAR2,p_vek IN NUMBER,p_plat IN NUMBER,p_naz_fce IN VARCHAR2,
p_naz_piv IN VARCHAR2) ASv_id_funkce NUMBER;v_id_piv NUMBER;v_id_zam NUMBER;cursor c_emp ISSELECT id_zam,jmeno,prijmeni,plat,vek FROM emp e WHERE
e.prijmeni=INITCAP(p_prijmeni) AND e.jmeno=INITCAP(p_jmeno) AND e.vek=p_vek AND e.plat=p_plat;
BEGIN SELECT count(id_f) INTO v_id_funkce FROM funkce WHERE nazev=INITCAP(p_naz_fce); IF v_id_funkce=0 THEN DBMS_OUTPUT.PUT_LINE('Zakladam novou funkci: '||INITCAP(p_naz_fce)); INSERT INTO funkce(nazev) VALUES (INITCAP(p_naz_fce)); ELSE DBMS_OUTPUT.PUT_LINE('Funkce jiz existuje'); END IF; SELECT id_f INTO v_id_funkce FROM funkce WHEREnazev=INITCAP(p_na_fce) DBMS_OUTPUT.PUT_LINE('Id funckce je: '||v_id_funkce);
Napiste proceduru, jejimiz parametry bude prijmeni, jmeno, vek, plat, nazev funkce a nazev pivovaru.Kdyz neni zadana funkce,vytvori se nova, to stejne s pivovarem. Nakonec v pripade, ze nebude existovat ani samotny zamestnanec, bude i on pridan do tabulky zamci.
SELECT count(id_p) INTO v_id_piv FROM brew WHEREjmeno=p_naz_piv);IF v_id_piv=0 THEN DBMS_OUTPUT.PUT_LINE('Zakladam pivovar: '||INITCAP(p_naz_piv)); INSERT INTO brew(jmeno) VALUES (INITCAP(p_naz_piv));ELSE DBMS_OUTPUT.PUT_LINE('Pivovar jiz existuje');END IF;SELECT id_p INTO v_id_piv FROM brew WHERE jmeno=p_naz_piv;DBMS_OUTPUT.PUT_LINE('Id pivovaru je: '||v_id_piv);
SELECT count(id_zam) INTO v_id_zam FROM emp e WHEREe.prijmeni=INITCAP(p_prijmeni) AND e.jmeno=INITCAP(p_jmeno) ANDe.vek=p_vek AND e.plat=p_plat;IF v_id_zam=0 THEN DBMS_OUTPUT.PUT_LINE('Zakladam noveho zamestnance!'); INSERT INTO emp(prijmeni,jmeno,vek,plat,prace,prislusnost) VALUES(INITCAP(p_prijmeni),INITCAP(p_jmeno),p_vek,p_plat, v_id_funkce,v_id_piv );ELSE DBMS_OUTPUT.PUT_LINE('Zamestnanec jiz existuje');END IF;
FOR info IN c_emp LOOP DBMS_OUTPUT.PUT_LINE('ID zamestnance: '||info.id_zam); DBMS_OUTPUT.PUT_LINE('Prijmeni: '||info.prijmeni); DBMS_OUTPUT.PUT_LINE('Jmeno: '||info.jmeno); DBMS_OUTPUT.PUT_LINE('Vek: '||info.vek); DBMS_OUTPUT.PUT_LINE('Plat: '||info.plat); EXIT WHEN c_emp%NOTFOUND; END LOOP;END;
7/ DML TRIGGER
CREATE OR REPLACE TRIGGER "BI_EMP" BEFORE insert on "EMP" FOR each row BEGIN if :NEW."ID_ZAM" is null then SELECT "EMP_SEQ".nextval into :NEW."ID_ZAM" from dual; end if; END;
Napiste trigger, ktery automatizovane zajisti vlozeni ID_ZAM z prislusne sekvence pri vkladni noveho zaznamu do tabulky EMP.
Děkuji za pozornost…
…a dotazy?