CREATE OR REPLACE TRIGGER wyzw BEFORE INSERT ON lekarze FOR EACH ROw DECLARE l_spec NUMBER(10); BEGIN SELECT count(*) INTO l_spec FROM lekarze WHERE id_specjalizacja=:NEW.id_specjalizacja; GROUP BY id_pokoj IF :NEW.data_urodzenia>SYSDATE THEN RAISE_APPLICATION_ERROR(-20000,'Blad wieku'); END IF; IF l_spec>9 THEN RAISE_APPLICATION_ERROR(-20001,'Za dużo specjalistów'); END IF; END;
CREATE OR REPLACE procedure proc CURSOR cur AS SELECT * FROM pacjenci FOR UPDATE; wyj exception; BEGIN FOR tmp in cur LOOP IF tmp.imie IS NULL THEN RAISE wyj; IF tmp.wiek>100 THEN //usuwanie END LOOP; EXCEPTION WHEN wyj then DBMS_OUTPUT.PUT_LINE('Blad'); END; EXECUTE proc;
CREATE OR REPLACE FUNCTION roznica AS RETURN NuMBER; st opieka.poczatek%ROWTYPE; kon opieka.koniec%ROWTYPE; ??roz lekarze.staz%TYPE;?? BEGIN SELECT poczatek INTO st FROM opieka; SELECT koniec INTO kon FROM opieka; roz:=kon-st; return roz; END; SELECT roznica FROM dual;
CREATE OR REPLACE VIEW widok AS SELECT l.imie, l.nazwisko, ilosc FROM lekarze l, opieka o ( SELECT id_pacjent nazwa, count(*) ilosc FROM opieka GROUP By id_pacjent ) WHERE p.id=nazwa AND l.id=o.id_lekarz AND o.poczatek IS NOT NULL;
select p.imie,p.nazwisko, p.wiek FROM pacjenci p ( SELECT l.id, count(*) il FROM lekarze l SUM(EXTRACT (YEAR FROM SYSDATE) - EXTRACT(YEAR FROM l.data_urodzenia)) suma GROUP BY l.id) ilo WHERE nazwisko like '%a' AND p.wiek> suma/ilo to jest pierwwsze ale nie wiem czy do końca dobrze mozesz się spytać miśka albo szcze SELECT nazwa,liczba FROM pokoje, ( SELECT id_pokoj numer,count(*) liczba FROM pacjenci GROUP BY id_pokoj HAVING count(*)>2 ) WHERe pokoje.id=numer ORDER BY nazwa DESC
SELECT l.imie,l.nazwisko, l.staz, l.data_urodzenia, s.nazwa, p.imie,p.nazwisko FROM lekarze l, pacjenci p, opieka o, specjalizacje s WHERE o.id_lekarz=l.id AND o.id_pacjent=p.id AND s.id=l.id_specjalizacja AND EXTRACT (YEAR FROM l.data_urodzenia)>1989
CREATE TABLE PRACOWNIK {
id_pracownik NUMBER(5) PRIMARY KEY,
imie VARCHAR2(30),
nazwisko VARCHAR2(30) };
CREATE TABLE KLIENT {
id_klient NUMBER(5) PRIMARY KEY,
imie VARCHAR2(30),
nazwisko VARCHAR2(30) };
CREATE TABLE SALA {
id_sala NUMBER(5) PRIMARY KEY
opis VARCHAR2(30)
ilosc_miejsc NUMBER(8)};
CREATE TABLE BILET{
id_bilet NUMBER(5) PRIMARY KEY,
id_pracownik NUMBER(5) references pracownik(id_pracownik),
id_klient NUMBER(5) references klient(id_klient),
data_wystawienia date};
CREATE TABLE POZYCJA_BILETU{
id_pozycja_biletu NUMBER(5) PRIMARY KEY,
id_bilet NUMBER(5) REFERENCES bilet(id_bilet),
id_sala NUMBER(5) references sala(id_sala),
id_seans NUMBER(5) references seans(id_seans)
rzad NUMBER(5),
kolumna number(5)};
CREATE TABLE SEANS {
id_seans NUMBER(5) PRIMARY KEY,
nazwa_filmu VARCHAR2(30),
rezyser VARCHAR2(30) } ;
A)
select imie,nazwisko,staz
FROM lekarze
WHERE nazwisko like '%ska'
AND staz>(SELECT avg(staz) FROM lekarze);
B)
SELECT p.imie,p.nazwisko,l.imie,l.nazwisko
FROM lekarze l, pacjenci p, opieka o
WHERE o.id_lekarz=l.id
AND o.id_pacjent=p.id
AND p.wiek>14;
C)
SELECT nazwa,liczba FROM pokoje,
(
SELECT id_pokoj numer,count(*) liczba
FROM pacjenci
GROUP BY id_pokoj
HAVING count(*)>2
)
WHERe pokoje.id=numer;
D)
SELECT nazwa,ilosc FROM specjalizacje,s
(
SELECT id_specjalizacja nazwa, count(*) ilosc
FROM lekarze
GROUP By id_specjalizacja
)
WHERE s.id=nazwa(+);
E)
CREATE OR REPLACE FUNCTION roznica AS
RETURN NuMBER;
minimalny lekarze.staz%TYPE;
maksymalny lekarze.staz%TYPE;
roz lekarze.staz%TYPE;
BEGIN
SELECT min(staz) INTO minimalny FROM lekarze;
SELECT max(staz) INTO maksymalny FROM lekarze;
roz:=maksymalny-minimalny;
return roz;
END;
SELECT roznica FROM dual;
F)
CREATE OR REPLACE procedura spr_lek
CURSOR cur AS SELECT * FROM lekarze FOR UPDATE;
wyj exception;
BEGIN
FOR tmp in cur LOOP
IF tmp.imie IS NULL THEN
RAISE wyj;
IF tmp.data_urodzenia>sysdate THEN
UPDATE lekarze SET data_urodzenia=sysdate where current of cur;
END LOOP;
EXCEPTION
WHEN wyj then
DBMS_OUTPUT.PUT_LINE('Blad');
END;
EXECUTE spr_lek;
G)
CREATE OR REPLACE TRIGGER wyzw
BEFORE INSERT ON pacjenci FOR EACH ROw
DECLARE
l_pokoj NUMBER(10);
BEGIN
SELECT count(*) INTO l_pokoj FROM pacjenci
WHERE id_pokoj=:NEW.id_pokoj;
GROUP BY id_pokoj
IF :NEW.wiek<zm THEN
RAISE_APPLICATION_ERROR(-20000,'Blad wieku');
END IF;
IF :new.id_pokoj>l_pokoj THEN
RAISE_APPLICATION_ERROR(-20001,'Blad pokoju');
END IF;
END;