Advertisement
Agno

Untitled

Oct 21st, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.55 KB | None | 0 0
  1. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  2. VALUES ('Adam', 'Kowalski', '87654321', 'tel: 6623');
  3.  
  4. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  5. VALUES ('Jan', 'Nowak', '12345678', 'tel: 2312, dzwonić po 18.00');
  6.  
  7. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  8. VALUES ('Piotr', 'Kędra', '13579246', 'tel: 6666');
  9.  
  10. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  11. VALUES ('Marcelina', 'Banaś', '99988877', 'tel: 2460');
  12.  
  13. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  14. VALUES ('Jan', 'Ilczuk', '11122233', 'tel: 4342');
  15.  
  16. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  17. VALUES ('Stacy', 'Noland', '44444444', 'tel: 6677');
  18.  
  19. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  20. VALUES ('Rachel', 'McAdams', '98765432', 'tel: 5555');
  21.  
  22. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  23. VALUES ('Monica', 'Belucci', '65654543', 'tel: 0976');
  24.  
  25. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  26. VALUES ('Rafał', 'Banaś', '65434343', 'tel: 4343');
  27.  
  28. INSERT INTO osoby (imie, nazwisko, pesel, kontakt)
  29. VALUES ('Damian', 'Markowski', '95456569', 'tel: 1342');
  30.  
  31. INSERT INTO wycieczki (nazwa, kraj, data, opis, liczba_miejsc)
  32. VALUES ('Wycieczka do Paryza', 'Francja', TO_DATE('2016-01-01', 'YYYY-MM-DD'), 'Ciekawa wycieczka ...', 3);
  33.  
  34. INSERT INTO wycieczki (nazwa, kraj, data, opis, liczba_miejsc)
  35. VALUES ('Piękny Kraków', 'Polska', TO_DATE('2020-02-03', 'YYYY-MM-DD'), 'Najciekawa wycieczka ...', 2);
  36.  
  37. INSERT INTO wycieczki (nazwa, kraj, data, opis, liczba_miejsc)
  38. VALUES ('Wieliczka', 'Polska', TO_DATE('2020-03-03', 'YYYY-MM-DD'), 'Zadziwiająca kopalnia ...', 2);
  39.  
  40. INSERT INTO wycieczki (nazwa, kraj, data, opis, liczba_miejsc)
  41. VALUES ('Warszawa wyjazd', 'Polska', TO_DATE('2020-04-12', 'YYYY-MM-DD'), 'Miasto prezydentów ...', 4);
  42.  
  43. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  44. VALUES (3, 1, 'N');
  45.  
  46. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  47. VALUES (3, 2, 'P');
  48.  
  49. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  50. VALUES (3, 3, 'A');
  51.  
  52. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  53. VALUES (3, 4, 'Z');
  54.  
  55. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  56. VALUES (4, 3, 'Z');
  57.  
  58. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  59. VALUES (4, 5, 'P');
  60.  
  61. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  62. VALUES (5, 6, 'N');
  63.  
  64. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  65. VALUES (6, 7, 'P');
  66.  
  67. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  68. VALUES (6, 8, 'N');
  69.  
  70. INSERT INTO rezerwacje(id_wycieczki, id_osoby, status)
  71. VALUES (6, 9, 'P');
  72.  
  73. CREATE OR REPLACE VIEW wycieczki_osoby
  74. AS
  75. SELECT w.ID_WYCIECZKI,
  76. w.NAZWA,
  77. w.KRAJ,
  78. w.DATA,
  79. o.IMIE,
  80. o.NAZWISKO,
  81. r.STATUS
  82. FROM WYCIECZKI w
  83. JOIN REZERWACJE r ON w.ID_WYCIECZKI = r.ID_WYCIECZKI
  84. JOIN OSOBY o ON r.ID_OSOBY = o.ID_OSOBY
  85. WHERE r.STATUS <> 'A';
  86.  
  87.  
  88. CREATE OR REPLACE VIEW wycieczki_osoby_potwierdzone
  89. AS
  90. SELECT w.ID_WYCIECZKI,
  91. w.NAZWA,
  92. w.KRAJ,
  93. w.DATA,
  94. o.IMIE,
  95. o.NAZWISKO,
  96. r.STATUS
  97. FROM WYCIECZKI w
  98. JOIN REZERWACJE r ON w.ID_WYCIECZKI = r.ID_WYCIECZKI
  99. JOIN OSOBY o ON r.ID_OSOBY = o.ID_OSOBY
  100. WHERE r.STATUS LIKE 'P';
  101.  
  102. CREATE OR REPLACE VIEW wycieczki_przyszle
  103. AS
  104. SELECT w.ID_WYCIECZKI,
  105. w.NAZWA,
  106. w.KRAJ,
  107. w.DATA,
  108. o.IMIE,
  109. o.NAZWISKO,
  110. r.STATUS
  111. FROM WYCIECZKI w
  112. JOIN REZERWACJE r ON w.ID_WYCIECZKI = r.ID_WYCIECZKI
  113. JOIN OSOBY o ON r.ID_OSOBY = o.ID_OSOBY
  114. WHERE w.DATA > CURRENT_DATE;
  115.  
  116. CREATE OR REPLACE VIEW wycieczki_miejsca
  117. AS
  118. SELECT w.ID_WYCIECZKI,
  119. w.NAZWA,
  120. w.KRAJ,
  121. w.DATA,
  122. w.LICZBA_MIEJSC,
  123. (w.LICZBA_MIEJSC - COUNT(DISTINCT r.ID_OSOBY)) as LICZBA_WOLNYCH_MIEJSC
  124. FROM WYCIECZKI w
  125. LEFT JOIN REZERWACJE r ON r.ID_WYCIECZKI = w.ID_WYCIECZKI
  126. where r.STATUS <> 'A'
  127. GROUP BY w.ID_WYCIECZKI, w.NAZWA, w.KRAJ, w.DATA, w.LICZBA_MIEJSC;
  128.  
  129. CREATE OR REPLACE VIEW dostepne_wycieczki
  130. AS
  131. SELECT w.ID_WYCIECZKI,
  132. w.NAZWA,
  133. w.KRAJ,
  134. w.DATA,
  135. w.LICZBA_MIEJSC,
  136. w.LICZBA_WOLNYCH_MIEJSC
  137. FROM wycieczki_miejsca w
  138. WHERE w.LICZBA_WOLNYCH_MIEJSC > 0
  139. AND w.DATA > CURRENT_DATE;
  140.  
  141. CREATE OR REPLACE VIEW rezerwacje_do_anulowania
  142. AS
  143. SELECT r.NR_REZERWACJI,
  144. o.IMIE,
  145. o.NAZWISKO,
  146. w.NAZWA,
  147. w.DATA,
  148. r.STATUS
  149. FROM OSOBY o
  150. JOIN REZERWACJE r on o.ID_OSOBY = r.ID_OSOBY
  151. JOIN WYCIECZKI w on r.ID_WYCIECZKI = w.ID_WYCIECZKI
  152. WHERE r.STATUS = 'N'
  153. AND w.DATA < (CURRENT_DATE - 7);
  154.  
  155. ----------------------------------------------------------------
  156.  
  157. CREATE OR REPLACE TYPE uczestnicy_wycieczki_r AS object
  158. (
  159. kraj VARCHAR(50),
  160. "data" DATE,
  161. nazwa_wycieczki VARCHAR(100),
  162. imie VARCHAR2(50),
  163. nazwisko VARCHAR2(50),
  164. status CHAR(1)
  165. );
  166.  
  167. CREATE OR REPLACE TYPE uczestnicy_wycieczki_t IS TABLE OF uczestnicy_wycieczki_r;
  168.  
  169. CREATE OR REPLACE FUNCTION uczestnicy_wycieczki(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE)
  170. RETURN uczestnicy_wycieczki_t as
  171. owt uczestnicy_wycieczki_t;
  172. exist integer;
  173. BEGIN
  174. SELECT COUNT(*) INTO exist FROM WYCIECZKI w WHERE w.ID_WYCIECZKI = uczestnicy_wycieczki.id_wycieczki;
  175.  
  176. if exist = 0 THEN
  177. raise_application_error(-20001, 'Brak wycieczki o danym id');
  178. end if;
  179.  
  180. SELECT uczestnicy_wycieczki_r(w.Kraj, w.DATA, w.NAZWA, o.IMIE, o.NAZWISKO, r.STATUS)
  181. BULK COLLECT
  182. INTO owt
  183. FROM WYCIECZKI w
  184. JOIN REZERWACJE r ON w.ID_WYCIECZKI = r.ID_WYCIECZKI
  185. JOIN OSOBY o on r.ID_OSOBY = o.ID_OSOBY
  186. WHERE w.ID_WYCIECZKI = uczestnicy_wycieczki.id_wycieczki
  187. AND r.STATUS <> 'A';
  188. return owt;
  189. END;
  190.  
  191. select *
  192. from table (uczestnicy_wycieczki(3));
  193.  
  194. CREATE OR REPLACE FUNCTION rezerwacje_osoby(id_osoby OSOBY.ID_OSOBY%TYPE)
  195. return uczestnicy_wycieczki_t as
  196. owt uczestnicy_wycieczki_t;
  197. exist integer;
  198. BEGIN
  199. SELECT COUNT(*) INTO exist FROM OSOBY o WHERE o.ID_OSOBY = rezerwacje_osoby.id_osoby;
  200.  
  201. if exist = 0 THEN
  202. raise_application_error(-20001, 'Brak osoby o danym id');
  203. end if;
  204.  
  205. SELECT uczestnicy_wycieczki_r(w.Kraj, w.DATA, w.NAZWA, o.IMIE, o.NAZWISKO, r.STATUS)
  206. BULK COLLECT
  207. INTO owt
  208. FROM WYCIECZKI w
  209. JOIN REZERWACJE r ON w.ID_WYCIECZKI = r.ID_WYCIECZKI
  210. JOIN OSOBY o on r.ID_OSOBY = o.ID_OSOBY
  211. WHERE o.ID_OSOBY = rezerwacje_osoby.id_osoby
  212. AND r.STATUS <> 'A';
  213.  
  214. return owt;
  215. end;
  216.  
  217. select *
  218. from table (rezerwacje_osoby(1));
  219.  
  220. CREATE OR REPLACE FUNCTION przyszle_rezerwacje_osoby(id_osoby OSOBY.ID_OSOBY%TYPE)
  221. return uczestnicy_wycieczki_t as
  222. owt uczestnicy_wycieczki_t;
  223. exist integer;
  224. BEGIN
  225. SELECT COUNT(*) INTO exist FROM OSOBY o WHERE o.ID_OSOBY = przyszle_rezerwacje_osoby.id_osoby;
  226.  
  227. if exist = 0 THEN
  228. raise_application_error(-20001, 'Brak osoby o danym id');
  229. end if;
  230.  
  231. SELECT uczestnicy_wycieczki_r(w.Kraj, w.DATA, w.NAZWA, o.IMIE, o.NAZWISKO, r.STATUS)
  232. BULK COLLECT
  233. INTO owt
  234. FROM WYCIECZKI w
  235. JOIN REZERWACJE r ON w.ID_WYCIECZKI = r.ID_WYCIECZKI
  236. JOIN OSOBY o on r.ID_OSOBY = o.ID_OSOBY
  237. WHERE o.ID_OSOBY = przyszle_rezerwacje_osoby.id_osoby
  238. AND r.STATUS <> 'A'
  239. AND w.DATA > CURRENT_DATE;
  240.  
  241. return owt;
  242. end;
  243.  
  244. select *
  245. from table (przyszle_rezerwacje_osoby(3));
  246.  
  247. CREATE OR REPLACE TYPE wycieczki_r AS object
  248. (
  249. id_wycieczki NUMBER,
  250. nazwa VARCHAR2(100),
  251. kraj VARCHAR2(50),
  252. "data" DATE,
  253. liczba_miejsc NUMBER,
  254. liczba_wolnych_miejsc NUMBER
  255. );
  256.  
  257.  
  258. CREATE OR REPLACE TYPE wycieczki_t IS TABLE OF wycieczki_r;
  259.  
  260. CREATE OR REPLACE FUNCTION dostepne_wycieczki_function(kraj WYCIECZKI.KRAJ%TYPE,
  261. data_od DATE, data_do DATE)
  262. return wycieczki_t as
  263. wt wycieczki_t;
  264. BEGIN
  265.  
  266. SELECT wycieczki_r(w.ID_WYCIECZKI,
  267. w.NAZWA,
  268. w.KRAJ,
  269. w.DATA,
  270. w.LICZBA_MIEJSC,
  271. w.LICZBA_WOLNYCH_MIEJSC)
  272. BULK COLLECT
  273. INTO wt
  274. FROM dostepne_wycieczki w
  275. WHERE w.KRAJ = dostepne_wycieczki_function.kraj
  276. AND w.DATA >= data_od
  277. AND w.DATA <= data_do;
  278.  
  279. return wt;
  280. end;
  281.  
  282. select *
  283. from table (dostepne_wycieczki_function('Polska', TO_DATE('2019-03-07', 'YYYY-MM-DD'),
  284. TO_DATE('2020-03-07', 'YYYY-MM-DD')));
  285.  
  286.  
  287. -------------------------------------------------------------
  288.  
  289.  
  290. CREATE OR REPLACE PROCEDURE dodaj_rezerwacje(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE, id_osoby OSOBY.ID_OSOBY%TYPE) AS
  291. exist integer;
  292. BEGIN
  293. SELECT COUNT(*) INTO exist FROM OSOBY o WHERE o.ID_OSOBY = dodaj_rezerwacje.id_osoby;
  294.  
  295. if exist = 0 then
  296. raise_application_error(-20001, 'Brak osoby o danym id');
  297. end if;
  298.  
  299. SELECT COUNT(*) INTO exist FROM DOSTEPNE_WYCIECZKI w WHERE w.ID_WYCIECZKI = dodaj_rezerwacje.id_wycieczki;
  300.  
  301. if exist = 0 then
  302. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  303. end if;
  304.  
  305. INSERT INTO REZERWACJE(id_wycieczki, id_osoby, STATUS)
  306. VALUES (dodaj_rezerwacje.id_wycieczki, dodaj_rezerwacje.id_osoby, 'N');
  307.  
  308. END;
  309.  
  310. SELECT COUNT(*)
  311. FROM DOSTEPNE_WYCIECZKI w
  312. WHERE w.ID_WYCIECZKI = 5;
  313.  
  314. begin
  315. DODAJ_REZERWACJE(
  316. 6, 1
  317. );
  318. end;
  319.  
  320. CREATE OR REPLACE PROCEDURE zmien_status_rezerwacji(id_rezerwacji REZERWACJE.NR_REZERWACJI%TYPE,
  321. status REZERWACJE.STATUS%TYPE) AS
  322. exist integer;
  323. old_status REZERWACJE.STATUS%TYPE;
  324. BEGIN
  325. SELECT COUNT(*)
  326. INTO exist
  327. from wycieczki_przyszle wp
  328. join REZERWACJE r on r.ID_WYCIECZKI = wp.ID_WYCIECZKI
  329. WHERE r.NR_REZERWACJI = id_rezerwacji;
  330.  
  331. if exist = 0 then
  332. raise_application_error(-20001, 'Nie ma takiej wycieczki w przyszlosci');
  333. end if;
  334.  
  335. SELECT status
  336. INTO old_status
  337. from REZERWACJE r
  338. WHERE r.NR_REZERWACJI = id_rezerwacji;
  339.  
  340. CASE
  341. WHEN old_status is NULL
  342. then
  343. raise_application_error(-20001, 'Nie ma takiej rezerwacji');
  344. WHEN old_status = 'A' then
  345. SELECT COUNT(*)
  346. INTO exist
  347. FROM dostepne_wycieczki dw
  348. join REZERWACJE r on r.ID_WYCIECZKI = dw.ID_WYCIECZKI
  349. WHERE r.NR_REZERWACJI = id_rezerwacji;
  350. if exist = 0 then
  351. raise_application_error(-20001, 'Nie ma miejsc na zmiane rezerwacji z anulowanej');
  352. end if;
  353. ELSE null;
  354. END CASE;
  355.  
  356. UPDATE REZERWACJE
  357. SET STATUS = zmien_status_rezerwacji.status
  358. WHERE NR_REZERWACJI = id_rezerwacji;
  359.  
  360. END;
  361.  
  362. begin
  363. zmien_status_rezerwacji(
  364. 21, 'P'
  365. );
  366. end;
  367.  
  368. CREATE OR REPLACE PROCEDURE zmien_liczbe_miejsc(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE,
  369. liczba_miejsc WYCIECZKI.LICZBA_MIEJSC%TYPE) AS
  370. exist integer;
  371. BEGIN
  372. SELECT COUNT(*) INTO exist FROM wycieczki_przyszle w WHERE w.ID_WYCIECZKI = zmien_liczbe_miejsc.id_wycieczki;
  373.  
  374. if exist = 0 then
  375. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  376. end if;
  377.  
  378. SELECT wm.LICZBA_MIEJSC - wm.LICZBA_WOLNYCH_MIEJSC
  379. into exist
  380. from wycieczki_miejsca wm
  381. where wm.ID_WYCIECZKI = zmien_liczbe_miejsc.id_wycieczki;
  382.  
  383. if zmien_liczbe_miejsc.liczba_miejsc < 0 OR exist > zmien_liczbe_miejsc.liczba_miejsc then
  384. raise_application_error(-20001, 'Liczba miejsc za niska');
  385. end if;
  386.  
  387. UPDATE WYCIECZKI
  388. SET LICZBA_MIEJSC = zmien_liczbe_miejsc.liczba_miejsc
  389. Where id_wycieczki = zmien_liczbe_miejsc.id_wycieczki;
  390. END;
  391.  
  392. begin
  393. ZMIEN_LICZBE_MIEJSC(6, 10);
  394. end;
  395.  
  396.  
  397. ----------------------------------------------------------
  398.  
  399. CREATE TABLE REZERWACJE_LOG
  400. (
  401. ID INT GENERATED ALWAYS AS IDENTITY NOT NULL,
  402. ID_REZERWACJI INT,
  403. DATA DATE,
  404. STATUS CHAR(1),
  405. CONSTRAINT REZERWACJE_LOG_PK PRIMARY KEY (
  406. ID
  407. ) ENABLE
  408. );
  409.  
  410. ALTER TABLE REZERWACJE_LOG
  411. ADD CONSTRAINT REZERWACJE_LOG_FK1 FOREIGN KEY
  412. (
  413. ID_REZERWACJI
  414. )
  415. REFERENCES REZERWACJE
  416. (
  417. NR_REZERWACJI
  418. )
  419. ENABLE;
  420.  
  421. CREATE OR REPLACE PROCEDURE dodaj_rezerwacje(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE, id_osoby OSOBY.ID_OSOBY%TYPE) AS
  422. exist integer;
  423. id_rezerwacji REZERWACJE.nr_rezerwacji%TYPE;
  424. BEGIN
  425. SELECT COUNT(*) INTO exist FROM OSOBY o WHERE o.ID_OSOBY = dodaj_rezerwacje.id_osoby;
  426.  
  427. if exist = 0 then
  428. raise_application_error(-20001, 'Brak osoby o danym id');
  429. end if;
  430.  
  431. SELECT COUNT(*) INTO exist FROM DOSTEPNE_WYCIECZKI w WHERE w.ID_WYCIECZKI = dodaj_rezerwacje.id_wycieczki;
  432.  
  433. if exist = 0 then
  434. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  435. end if;
  436.  
  437. INSERT INTO REZERWACJE(id_wycieczki, id_osoby, STATUS)
  438. VALUES (dodaj_rezerwacje.id_wycieczki, dodaj_rezerwacje.id_osoby, 'N')
  439. RETURNING NR_REZERWACJI INTO id_rezerwacji;
  440.  
  441. INSERT INTO REZERWACJE_LOG (ID_REZERWACJI, DATA, STATUS)
  442. VALUES (id_rezerwacji, CURRENT_DATE, 'N');
  443. END;
  444.  
  445. CREATE OR REPLACE PROCEDURE zmien_status_rezerwacji(id_rezerwacji REZERWACJE.NR_REZERWACJI%TYPE,
  446. status REZERWACJE.STATUS%TYPE) AS
  447. exist integer;
  448. old_status REZERWACJE.STATUS%TYPE;
  449. BEGIN
  450. SELECT COUNT(*)
  451. INTO exist
  452. from wycieczki_przyszle wp
  453. join REZERWACJE r on r.ID_WYCIECZKI = wp.ID_WYCIECZKI
  454. WHERE r.NR_REZERWACJI = id_rezerwacji;
  455.  
  456. if exist = 0 then
  457. raise_application_error(-20001, 'Nie ma takiej wycieczki w przyszlosci');
  458. end if;
  459.  
  460. SELECT status
  461. INTO old_status
  462. from REZERWACJE r
  463. WHERE r.NR_REZERWACJI = id_rezerwacji;
  464.  
  465. CASE
  466. WHEN old_status is NULL
  467. then
  468. raise_application_error(-20001, 'Nie ma takiej rezerwacji');
  469. WHEN old_status = 'A' then
  470. SELECT COUNT(*)
  471. INTO exist
  472. FROM dostepne_wycieczki dw
  473. join REZERWACJE r on r.ID_WYCIECZKI = dw.ID_WYCIECZKI
  474. WHERE r.NR_REZERWACJI = id_rezerwacji;
  475. if exist = 0 then
  476. raise_application_error(-20001, 'Nie ma miejsc na zmiane rezerwacji z anulowanej');
  477. end if;
  478. END CASE;
  479.  
  480. UPDATE REZERWACJE r
  481. SET r.STATUS = zmien_status_rezerwacji.status
  482. WHERE r.NR_REZERWACJI = id_rezerwacji;
  483.  
  484. INSERT INTO REZERWACJE_LOG (ID_REZERWACJI, DATA, STATUS)
  485. VALUES (id_rezerwacji, CURRENT_DATE, zmien_status_rezerwacji.status);
  486.  
  487. END;
  488.  
  489. -----------------------
  490.  
  491. ALTER TABLE WYCIECZKI
  492. ADD liczba_wolnych_miejsc INT;
  493.  
  494. CREATE OR REPLACE PROCEDURE przelicz AS
  495. BEGIN
  496. UPDATE WYCIECZKI w
  497. SET LICZBA_WOLNYCH_MIEJSC = LICZBA_MIEJSC - (SELECT COUNT(*)
  498. FROM REZERWACJE r
  499. WHERE r.ID_WYCIECZKI = w.ID_WYCIECZKI
  500. AND r.STATUS <> 'A');
  501. END;
  502.  
  503. begin
  504. PRZELICZ;
  505. end;
  506.  
  507. CREATE OR REPLACE VIEW dostepne_wycieczki2
  508. AS
  509. SELECT w.id_wycieczki,
  510. w.kraj,
  511. w.data,
  512. w.nazwa,
  513. w.liczba_miejsc,
  514. w.liczba_wolnych_miejsc
  515. FROM WYCIECZKI w
  516. WHERE liczba_wolnych_miejsc > 0
  517. AND w.DATA > CURRENT_DATE;
  518.  
  519. CREATE OR REPLACE VIEW wycieczki_miejsca2
  520. AS
  521. SELECT w.ID_WYCIECZKI,
  522. w.kraj,
  523. w.data,
  524. w.nazwa,
  525. w.liczba_miejsc,
  526. w.LICZBA_WOLNYCH_MIEJSC
  527. FROM wycieczki w;
  528.  
  529. CREATE OR REPLACE PROCEDURE dodaj_rezerwacje2(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE, id_osoby OSOBY.ID_OSOBY%TYPE) AS
  530. exist integer;
  531. id_rezerwacji REZERWACJE.nr_rezerwacji%TYPE;
  532. BEGIN
  533. SELECT COUNT(*) INTO exist FROM OSOBY o WHERE o.ID_OSOBY = dodaj_rezerwacje2.id_osoby;
  534.  
  535. if exist = 0 then
  536. raise_application_error(-20001, 'Brak osoby o danym id');
  537. end if;
  538.  
  539. SELECT COUNT(*) INTO exist FROM DOSTEPNE_WYCIECZKI w WHERE w.ID_WYCIECZKI = dodaj_rezerwacje2.id_wycieczki;
  540.  
  541. if exist = 0 then
  542. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  543. end if;
  544.  
  545. INSERT INTO REZERWACJE(id_wycieczki, id_osoby, STATUS)
  546. VALUES (dodaj_rezerwacje2.id_wycieczki, dodaj_rezerwacje2.id_osoby, 'N')
  547. RETURNING NR_REZERWACJI INTO id_rezerwacji;
  548.  
  549. UPDATE WYCIECZKI
  550. SET LICZBA_WOLNYCH_MIEJSC = LICZBA_WOLNYCH_MIEJSC - 1
  551. WHERE ID_WYCIECZKI = dodaj_rezerwacje2.id_wycieczki;
  552.  
  553. INSERT INTO REZERWACJE_LOG (ID_REZERWACJI, DATA, STATUS)
  554. VALUES (id_rezerwacji, CURRENT_DATE, 'N');
  555. END;
  556.  
  557. begin
  558. DODAJ_REZERWACJE2(6, 2);
  559. end;
  560.  
  561. CREATE OR REPLACE PROCEDURE zmien_status_rezerwacji2(id_rezerwacji REZERWACJE.NR_REZERWACJI%TYPE,
  562. status REZERWACJE.STATUS%TYPE) AS
  563. exist integer;
  564. old_status REZERWACJE.STATUS%TYPE;
  565. wolne_miejsca_roznica integer;
  566. BEGIN
  567. SELECT COUNT(*)
  568. INTO exist
  569. from wycieczki_przyszle wp
  570. join REZERWACJE r on r.ID_WYCIECZKI = wp.ID_WYCIECZKI
  571. WHERE r.NR_REZERWACJI = id_rezerwacji;
  572.  
  573. if exist = 0 then
  574. raise_application_error(-20001, 'Nie ma takiej wycieczki w przyszlosci');
  575. end if;
  576.  
  577. SELECT status
  578. INTO old_status
  579. from REZERWACJE r
  580. WHERE r.NR_REZERWACJI = id_rezerwacji;
  581.  
  582. CASE
  583. WHEN old_status is NULL
  584. then
  585. raise_application_error(-20001, 'Nie ma takiej rezerwacji');
  586. WHEN old_status = 'A' then
  587. SELECT COUNT(*)
  588. INTO exist
  589. FROM dostepne_wycieczki dw
  590. join REZERWACJE r on r.ID_WYCIECZKI = dw.ID_WYCIECZKI
  591. WHERE r.NR_REZERWACJI = id_rezerwacji;
  592. IF exist = 0 THEN
  593. raise_application_error(-20001, 'Nie ma miejsc na zmiane rezerwacji z anulowanej');
  594. ELSE
  595. wolne_miejsca_roznica := -1;
  596. END IF;
  597. ELSE
  598. IF zmien_status_rezerwacji2.status = 'A'
  599. THEN
  600. wolne_miejsca_roznica := 1;
  601. ELSE
  602. wolne_miejsca_roznica := 0;
  603. END IF;
  604. END CASE;
  605.  
  606. UPDATE REZERWACJE r
  607. SET r.STATUS = zmien_status_rezerwacji2.status
  608. WHERE r.NR_REZERWACJI = id_rezerwacji;
  609.  
  610. UPDATE WYCIECZKI w
  611. SET LICZBA_WOLNYCH_MIEJSC = LICZBA_WOLNYCH_MIEJSC + wolne_miejsca_roznica
  612. WHERE w.ID_WYCIECZKI = (SELECT ID_WYCIECZKI
  613. FROM REZERWACJE r
  614. WHERE r.NR_REZERWACJI = id_rezerwacji);
  615.  
  616. INSERT INTO REZERWACJE_LOG (ID_REZERWACJI, DATA, STATUS)
  617. VALUES (id_rezerwacji, CURRENT_DATE, zmien_status_rezerwacji2.status);
  618.  
  619. END;
  620.  
  621. CREATE OR REPLACE PROCEDURE zmien_liczbe_miejsc2(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE,
  622. liczba_miejsc WYCIECZKI.LICZBA_MIEJSC%TYPE) AS
  623. exist integer;
  624. BEGIN
  625. SELECT COUNT(*) INTO exist FROM DOSTEPNE_WYCIECZKI w WHERE w.ID_WYCIECZKI = zmien_liczbe_miejsc2.id_wycieczki;
  626.  
  627. if exist = 0 then
  628. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  629. end if;
  630.  
  631. SELECT wm.LICZBA_MIEJSC - wm.LICZBA_WOLNYCH_MIEJSC
  632. into exist
  633. from wycieczki_miejsca wm
  634. where wm.ID_WYCIECZKI = zmien_liczbe_miejsc2.id_wycieczki;
  635.  
  636. if zmien_liczbe_miejsc2.liczba_miejsc < 0 OR exist > zmien_liczbe_miejsc2.liczba_miejsc then
  637. raise_application_error(-20001, 'Liczba miejsc za niska');
  638. end if;
  639.  
  640. UPDATE WYCIECZKI w
  641. SET w.LICZBA_MIEJSC = zmien_liczbe_miejsc2.liczba_miejsc,
  642. w.LICZBA_WOLNYCH_MIEJSC = LICZBA_WOLNYCH_MIEJSC + zmien_liczbe_miejsc2.id_wycieczki - LICZBA_MIEJSC
  643. Where w.id_wycieczki = zmien_liczbe_miejsc2.id_wycieczki;
  644. END;
  645.  
  646. CREATE OR REPLACE FUNCTION dostepne_wycieczki_function2(kraj WYCIECZKI.KRAJ%TYPE,
  647. data_od DATE, data_do DATE)
  648. return wycieczki_t as
  649. wt wycieczki_t;
  650. BEGIN
  651.  
  652. SELECT wycieczki_r(w.ID_WYCIECZKI,
  653. w.NAZWA,
  654. w.KRAJ,
  655. w.DATA,
  656. w.LICZBA_MIEJSC,
  657. w.LICZBA_WOLNYCH_MIEJSC)
  658. BULK COLLECT
  659. INTO wt
  660. FROM dostepne_wycieczki2 w
  661. WHERE w.KRAJ = dostepne_wycieczki_function2.kraj
  662. AND w.DATA >= data_od
  663. AND w.DATA <= data_do;
  664.  
  665. return wt;
  666. end;
  667.  
  668. select *
  669. from table (dostepne_wycieczki_function2('Polska', TO_DATE('2019-03-07', 'YYYY-MM-DD'),
  670. TO_DATE('2020-03-07', 'YYYY-MM-DD')));
  671.  
  672.  
  673. ------------------------------------------------
  674.  
  675.  
  676. CREATE OR REPLACE PROCEDURE zmien_status_rezerwacji3(id_rezerwacji REZERWACJE.NR_REZERWACJI%TYPE,
  677. status REZERWACJE.STATUS%TYPE) AS
  678. exist integer;
  679. old_status REZERWACJE.STATUS%TYPE;
  680. BEGIN
  681. SELECT COUNT(*)
  682. INTO exist
  683. from wycieczki_przyszle wp
  684. join REZERWACJE r on r.ID_WYCIECZKI = wp.ID_WYCIECZKI
  685. WHERE r.NR_REZERWACJI = id_rezerwacji;
  686.  
  687. if exist = 0 then
  688. raise_application_error(-20001, 'Nie ma takiej wycieczki w przyszlosci');
  689. end if;
  690.  
  691. SELECT status
  692. INTO old_status
  693. from REZERWACJE r
  694. WHERE r.NR_REZERWACJI = id_rezerwacji;
  695.  
  696. CASE
  697. WHEN old_status is NULL
  698. then
  699. raise_application_error(-20001, 'Nie ma takiej rezerwacji');
  700. WHEN old_status = 'A' then
  701. SELECT COUNT(*)
  702. INTO exist
  703. FROM dostepne_wycieczki dw
  704. join REZERWACJE r on r.ID_WYCIECZKI = dw.ID_WYCIECZKI
  705. WHERE r.NR_REZERWACJI = id_rezerwacji;
  706. if exist = 0 then
  707. raise_application_error(-20001, 'Nie ma miejsc na zmiane rezerwacji z anulowanej');
  708. end if;
  709. ELSE null;
  710. END CASE;
  711.  
  712. UPDATE REZERWACJE r
  713. SET r.STATUS = zmien_status_rezerwacji3.status
  714. WHERE r.NR_REZERWACJI = id_rezerwacji;
  715.  
  716. END;
  717.  
  718. CREATE OR REPLACE PROCEDURE dodaj_rezerwacje3(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE, id_osoby OSOBY.ID_OSOBY%TYPE) AS
  719. exist integer;
  720. id_rezerwacji REZERWACJE.nr_rezerwacji%TYPE;
  721. BEGIN
  722. SELECT COUNT(*) INTO exist FROM OSOBY o WHERE o.ID_OSOBY = dodaj_rezerwacje3.id_osoby;
  723.  
  724. if exist = 0 then
  725. raise_application_error(-20001, 'Brak osoby o danym id');
  726. end if;
  727.  
  728. SELECT COUNT(*) INTO exist FROM DOSTEPNE_WYCIECZKI w WHERE w.ID_WYCIECZKI = dodaj_rezerwacje3.id_wycieczki;
  729.  
  730. if exist = 0 then
  731. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  732. end if;
  733.  
  734. INSERT INTO REZERWACJE(id_wycieczki, id_osoby, STATUS)
  735. VALUES (dodaj_rezerwacje3.id_wycieczki, dodaj_rezerwacje3.id_osoby, 'N');
  736. END;
  737.  
  738. CREATE OR REPLACE PROCEDURE zmien_liczbe_miejsc3(id_wycieczki WYCIECZKI.ID_WYCIECZKI%TYPE,
  739. liczba_miejsc WYCIECZKI.LICZBA_MIEJSC%TYPE) AS
  740. exist integer;
  741. BEGIN
  742. SELECT COUNT(*) INTO exist FROM DOSTEPNE_WYCIECZKI w WHERE w.ID_WYCIECZKI = zmien_liczbe_miejsc3.id_wycieczki;
  743.  
  744. if exist = 0 then
  745. raise_application_error(-20001, 'Brak dostepnej wycieczki o danym id');
  746. end if;
  747.  
  748. SELECT wm.LICZBA_MIEJSC - wm.LICZBA_WOLNYCH_MIEJSC
  749. into exist
  750. from wycieczki_miejsca wm
  751. where wm.ID_WYCIECZKI = zmien_liczbe_miejsc3.id_wycieczki;
  752.  
  753. if zmien_liczbe_miejsc3.liczba_miejsc < 0 OR exist > zmien_liczbe_miejsc3.liczba_miejsc then
  754. raise_application_error(-20001, 'Liczba miejsc za niska');
  755. end if;
  756.  
  757. UPDATE WYCIECZKI w
  758. SET w.LICZBA_MIEJSC = zmien_liczbe_miejsc3.liczba_miejsc
  759. Where w.id_wycieczki = zmien_liczbe_miejsc3.id_wycieczki;
  760. END;
  761.  
  762. begin
  763. zmien_status_rezerwacji3(43, 'Z');
  764. end;
  765.  
  766. CREATE OR REPLACE TRIGGER dodawanie_rezerwacji_trigger
  767. AFTER INSERT
  768. ON REZERWACJE
  769. FOR EACH ROW
  770. BEGIN
  771. INSERT INTO REZERWACJE_LOG (ID_REZERWACJI, DATA, STATUS)
  772. VALUES (:NEW.NR_REZERWACJI, CURRENT_DATE, :NEW.STATUS);
  773.  
  774. UPDATE WYCIECZKI w
  775. SET LICZBA_WOLNYCH_MIEJSC = LICZBA_WOLNYCH_MIEJSC - 1
  776. WHERE w.ID_WYCIECZKI = :NEW.ID_WYCIECZKI;
  777. END;
  778.  
  779. CREATE OR REPLACE TRIGGER zmiana_statusu_trigger
  780. AFTER UPDATE
  781. ON REZERWACJE
  782. FOR EACH ROW
  783. DECLARE
  784. wolne_miejsca_roznica integer;
  785. BEGIN
  786. INSERT INTO REZERWACJE_LOG (ID_REZERWACJI, DATA, STATUS)
  787. VALUES (:NEW.NR_REZERWACJI, CURRENT_DATE, :NEW.STATUS);
  788.  
  789.  
  790. CASE
  791. WHEN :OLD.STATUS = 'A' AND :NEW.STATUS <> 'A'
  792. THEN
  793. wolne_miejsca_roznica := -1;
  794.  
  795. WHEN :OLD.STATUS <> 'A' AND :NEW.STATUS = 'A'
  796. THEN
  797. wolne_miejsca_roznica := 1;
  798. ELSE
  799. wolne_miejsca_roznica := 0;
  800. END CASE;
  801.  
  802. UPDATE WYCIECZKI w
  803. SET LICZBA_WOLNYCH_MIEJSC = LICZBA_WOLNYCH_MIEJSC + wolne_miejsca_roznica
  804. WHERE w.ID_WYCIECZKI = :NEW.ID_WYCIECZKI;
  805. END;
  806.  
  807. CREATE OR REPLACE TRIGGER usuniecie_rezerwacji_trigger
  808. BEFORE DELETE
  809. ON REZERWACJE
  810. FOR EACH ROW
  811. BEGIN
  812. raise_application_error(-20002, 'Nie mozna usuwac rezerwacji');
  813. END;
  814.  
  815. CREATE OR REPLACE TRIGGER zmiana_liczby_miejsc_trigger
  816. BEFORE UPDATE OF liczba_miejsc
  817. ON wycieczki
  818. FOR EACH ROW
  819. BEGIN
  820. SELECT :OLD.LICZBA_WOLNYCH_MIEJSC +
  821. :NEW.LICZBA_MIEJSC - :OLD.LICZBA_MIEJSC
  822. INTO :NEW.LICZBA_WOLNYCH_MIEJSC
  823. FROM Dual;
  824. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement