Advertisement
Guest User

Untitled

a guest
Jun 14th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 27.78 KB | None | 0 0
  1. -- Table Client
  2.  
  3. CREATE TABLE client (
  4.   client_id     NUMBER(10)      NOT NULL,
  5.   first_name    VARCHAR2(32)    NOT NULL,
  6.   last_name     VARCHAR2(32)    NOT NULL,
  7.   is_vip        NUMBER(1)       DEFAULT '0'
  8. );
  9. /
  10. ALTER TABLE client ADD (CONSTRAINT client_pk PRIMARY KEY (client_id));
  11. /
  12. CREATE SEQUENCE client_id_seq START WITH 1;
  13. /
  14. CREATE OR REPLACE TRIGGER client_id_trigger BEFORE INSERT ON client FOR EACH ROW
  15. BEGIN
  16.   SELECT client_id_seq.NEXTVAL INTO :NEW.client_id FROM   dual;
  17. END;
  18. /
  19. -- Table Employee
  20.  
  21. CREATE TABLE employee (
  22.   employee_id   NUMBER(10)      NOT NULL,
  23.   first_name    VARCHAR2(32)    NOT NULL,
  24.   last_name     VARCHAR2(32)    NOT NULL,
  25.   role          VARCHAR2(32)    NOT NULL
  26. );
  27. /
  28. ALTER TABLE employee ADD (CONSTRAINT employee_pk PRIMARY KEY (employee_id));
  29. /
  30. CREATE SEQUENCE employee_id_seq START WITH 1;
  31. /
  32. CREATE OR REPLACE TRIGGER employee_id_trigger BEFORE INSERT ON employee FOR EACH ROW
  33. BEGIN
  34.   SELECT employee_id_seq.NEXTVAL INTO :NEW.employee_id FROM  dual;
  35. END;
  36. /
  37. -- Table Category
  38. CREATE TABLE category (
  39.   category_id   NUMBER(10)      NOT NULL,
  40.   name          VARCHAR2(32)    NOT NULL,
  41.   price         NUMBER(8,2)     NOT NULL
  42. );
  43. /
  44. ALTER TABLE category ADD (CONSTRAINT category_pk PRIMARY KEY (category_id));
  45. /
  46. CREATE SEQUENCE category_id_seq START WITH 1;
  47. /
  48. CREATE OR REPLACE TRIGGER category_id_trigger BEFORE INSERT ON category
  49. FOR EACH ROW
  50. BEGIN
  51.   SELECT category_id_seq.NEXTVAL INTO :NEW.category_id FROM   dual;
  52. END;
  53. /
  54.  
  55. -- Table Room
  56.  
  57. CREATE TABLE room (
  58.   room_id       NUMBER(10)      NOT NULL,
  59.   category_id   NUMBER(10)      NOT NULL,
  60.   room_no       NUMBER(10)      NOT NULL,
  61.   CONSTRAINT room_fk_category
  62.     FOREIGN KEY (category_id)
  63.     REFERENCES category (category_id)
  64. );
  65. /
  66. ALTER TABLE room ADD (CONSTRAINT room_pk PRIMARY KEY (room_id));
  67. /
  68. CREATE SEQUENCE room_id_seq START WITH 1;
  69. /
  70. CREATE OR REPLACE TRIGGER room_id_trigger BEFORE INSERT ON room
  71. FOR EACH ROW
  72. BEGIN
  73.   SELECT room_id_seq.NEXTVAL INTO :NEW.room_id FROM   dual;
  74. END;
  75. /
  76. -- Table reservation
  77.  
  78. CREATE TABLE reservation (
  79.   reservation_id   NUMBER(10)      NOT NULL,
  80.   client_id        NUMBER(10)      NOT NULL,
  81.   category_id      NUMBER(10)      NOT NULL,
  82.   room_id          NUMBER(10),
  83.   start_date       DATE            NOT NULL,
  84.   end_date         DATE            NOT NULL,
  85.   status           VARCHAR2(32)    DEFAULT 'pending' NOT NULL,
  86.   price_per_night  NUMBER(8,2),
  87.   CONSTRAINT reservation_fk_client
  88.     FOREIGN KEY (client_id)
  89.     REFERENCES client (client_id),
  90.   CONSTRAINT reservation_fk_category
  91.     FOREIGN KEY (category_id)
  92.     REFERENCES category (category_id),
  93.   CONSTRAINT reservation_fk_room
  94.     FOREIGN KEY (room_id)
  95.     REFERENCES room (room_id)
  96. );
  97. /
  98. ALTER TABLE reservation ADD (CONSTRAINT reservation_pk PRIMARY KEY (reservation_id));
  99. /
  100. CREATE SEQUENCE reservation_id_seq START WITH 1;
  101. /
  102. CREATE OR REPLACE TRIGGER reservation_id_trigger BEFORE INSERT ON reservation
  103. FOR EACH ROW
  104. BEGIN
  105.   SELECT reservation_id_seq.NEXTVAL INTO :NEW.reservation_id FROM   dual;
  106. END;
  107. /
  108. CREATE OR REPLACE TRIGGER reservation_date_trigger
  109.   BEFORE INSERT OR UPDATE OR DELETE ON reservation
  110.   FOR EACH ROW
  111. BEGIN
  112.   IF :NEW.end_date < :NEW.start_date  THEN
  113.     Raise_Application_Error (-20343, 'End date after start date.');
  114.   END IF;
  115. END;
  116. /
  117. -- Table client_summary
  118. CREATE TABLE client_summary (
  119.     client_id       NUMBER(10)      NOT NULL,
  120.     first_name      VARCHAR2(32)    NOT NULL,
  121.     last_name       VARCHAR2(32)    NOT NULL,
  122.     how_many_times  NUMBER(10)      DEFAULT 0 NOT NULL,
  123.     how_many_night  NUMBER(10)      DEFAULT 0 NOT NULL,
  124.     CONSTRAINT client_summary_fk_client
  125.       FOREIGN KEY (client_id)
  126.       REFERENCES client (client_id)
  127. );
  128. /
  129. ALTER TABLE client_summary ADD (CONSTRAINT client_summary_pk PRIMARY KEY (client_id));
  130. /
  131. CREATE OR REPLACE TRIGGER reservation_summary_trigger
  132.   AFTER INSERT OR UPDATE OR DELETE ON reservation
  133.   FOR EACH ROW
  134. DECLARE
  135.       v_diff_days       NUMBER;
  136. BEGIN
  137.   IF DELETING THEN
  138.     v_diff_days := :NEW.end_date - :NEW.start_date;
  139.     UPDATE client_summary
  140.     SET    how_many_times = how_many_times - 1, how_many_night = how_many_night - v_diff_days
  141.     WHERE  client_id = :NEW.client_id;
  142.   END IF;
  143.  
  144.   IF INSERTING THEN
  145.     v_diff_days := :NEW.end_date - :NEW.start_date;
  146.     UPDATE client_summary
  147.     SET    how_many_times = how_many_times + 1, how_many_night = how_many_night + v_diff_days
  148.     WHERE  client_id = :NEW.client_id;
  149.   END IF;
  150.  
  151.   IF UPDATING THEN
  152.     v_diff_days := (:OLD.end_date - :OLD.start_date) - (:NEW.end_date - :NEW.start_date);
  153.     UPDATE client_summary
  154.     SET    how_many_times = how_many_times, how_many_night = how_many_night + v_diff_days
  155.     WHERE  client_id = :NEW.client_id;
  156.   END IF;
  157. END;
  158. /
  159. INSERT INTO client(first_name, last_name, is_vip) VALUES('Jan', 'Kowalski', 1);
  160. INSERT INTO client(first_name, last_name, is_vip) VALUES('Darek', 'Mazurczak', 0);
  161. INSERT INTO client(first_name, last_name, is_vip) VALUES('Marta', 'Jurek', 0);
  162. INSERT INTO client(first_name, last_name, is_vip) VALUES('Ola', 'Piwowarska', 0);
  163. /
  164. INSERT INTO employee(first_name, last_name, role) VALUES('Marta', 'Wdowa', 'normal');
  165. INSERT INTO employee(first_name, last_name, role) VALUES('Kuba', 'Kwiatowski', 'manager');
  166. /
  167. INSERT INTO category(name, price) VALUES('Niebieski', 100);
  168. INSERT INTO category(name, price) VALUES('Zielony', 200);
  169. /
  170. INSERT INTO room(category_id, room_no) VALUES (1, 10);
  171. INSERT INTO room(category_id, room_no) VALUES (1, 11);
  172. INSERT INTO room(category_id, room_no) VALUES (2, 20);
  173. INSERT INTO room(category_id, room_no) VALUES (2, 21);
  174. /
  175. INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (1, 1, 1, SYSDATE - 10, SYSDATE - 7, 'finished', 100);
  176. INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (2, 1, 2, SYSDATE - 5, SYSDATE + 10, 'current', 100);
  177. INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (3, 2, 3, SYSDATE, SYSDATE + 10, 'pending', 100);
  178. INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (4, 2, 3, SYSDATE + 3, SYSDATE + 8, 'pending', 100);
  179. INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (4, 2, 4, SYSDATE, SYSDATE + 1, 'pending', 100);
  180. INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (4, 2, 4, SYSDATE - 1, SYSDATE + 1, 'pending', 100);
  181. INSERT INTO reservation(client_id, category_id, start_date, end_date, status, price_per_night) VALUES (4, 2, SYSDATE + 5, SYSDATE + 8, 'pending', 100);
  182. /
  183. CREATE TABLE current_employee_id_value(x INT);
  184.  
  185. INSERT INTO current_employee_id_value VALUES (0);
  186.  
  187. COMMIT;
  188.  
  189. CREATE OR REPLACE PACKAGE get_current_employee_id
  190. AS
  191.   FUNCTION Val
  192.   RETURN NUMBER;
  193.   PROCEDURE set_val (
  194.     p_x IN NUMBER );
  195. END;
  196.  
  197. /
  198.  
  199. CREATE OR REPLACE PACKAGE BODY get_current_employee_id
  200. AS
  201.   FUNCTION Val
  202.   RETURN NUMBER
  203.   AS
  204.     l_x NUMBER;
  205.   BEGIN
  206.       SELECT x
  207.       INTO   l_x
  208.       FROM   current_employee_id_value;
  209.  
  210.       RETURN l_x;
  211.   END;
  212.   PROCEDURE Set_val(p_x IN NUMBER)
  213.   AS
  214.     PRAGMA autonomous_transaction;
  215.   BEGIN
  216.       UPDATE current_employee_id_value
  217.       SET    x = p_x;
  218.  
  219.       COMMIT;
  220.   END;
  221. END;
  222. /
  223. CREATE OR REPLACE PACKAGE hotel_mgmt AS
  224.  
  225.    FUNCTION new_employee (p_first_name VARCHAR2, p_last_name VARCHAR2, p_role VARCHAR2)
  226.        RETURN NUMBER;
  227.  
  228.    FUNCTION new_client (p_first_name VARCHAR2, p_last_name VARCHAR2, p_is_vip NUMERIC)
  229.        RETURN NUMBER;
  230.  
  231.    PROCEDURE print_free_rooms(p_start_date DATE, p_end_date DATE);
  232.  
  233.    FUNCTION save_new_reservation(
  234.        p_first_name VARCHAR2,
  235.        p_last_name VARCHAR2,
  236.        p_category VARCHAR2,
  237.        p_start_date DATE,
  238.        p_end_date DATE
  239.    )
  240.    RETURN NUMBER;
  241.  
  242.    FUNCTION save_new_vip_reservation(
  243.        p_first_name VARCHAR2,
  244.        p_last_name VARCHAR2,
  245.        p_category VARCHAR2,
  246.        p_date DATE
  247.    )
  248.    RETURN NUMBER;
  249.  
  250.    PROCEDURE client_reception (
  251.        p_first_name VARCHAR,
  252.        p_last_name VARCHAR
  253.    );
  254.  
  255.    PROCEDURE client_release (
  256.        p_first_name VARCHAR,
  257.        p_last_name VARCHAR
  258.    );
  259.  
  260.    PROCEDURE reservation_cancel (
  261.        p_reservation_id NUMBER
  262.    );
  263.  
  264.    FUNCTION count_number_of_visited_per_client(
  265.        p_first_name VARCHAR2,
  266.        p_last_Name VARCHAR2
  267.    )
  268.    RETURN NUMBER;
  269.  
  270.    PROCEDURE print_client_today;
  271.  
  272.    PROCEDURE remove_old_reservations;
  273.  
  274.    PROCEDURE reservation_client_raport;
  275. END hotel_mgmt;
  276. /
  277. CREATE OR REPLACE PACKAGE BODY hotel_mgmt AS
  278.  
  279.   FUNCTION new_employee (p_first_name VARCHAR2, p_last_name VARCHAR2, p_role VARCHAR2)
  280.       RETURN NUMBER
  281.   IS
  282.     new_emp_id NUMBER;
  283.   BEGIN
  284.     INSERT INTO employee(first_name, last_name, role) VALUES (p_first_name, p_last_name, p_role);
  285.     RETURN(employee_id_seq.CURRVAL);
  286.   END;
  287.  
  288.   FUNCTION new_client (p_first_name VARCHAR2, p_last_name VARCHAR2, p_is_vip NUMERIC)
  289.       RETURN NUMBER
  290.   IS
  291.   BEGIN
  292.     DECLARE
  293.       v_client client%ROWTYPE;
  294.     BEGIN
  295.       SELECT * INTO v_client FROM client WHERE first_name = p_first_name AND last_name = p_last_name;
  296.       Raise_Application_Error (-20343, 'Client found.');
  297.     EXCEPTION
  298.       WHEN NO_DATA_FOUND THEN
  299.         INSERT INTO client(first_name, last_name, is_vip) VALUES (p_first_name, p_last_name, p_is_vip);
  300.     END;
  301.     RETURN(client_id_seq.CURRVAL);
  302.   END;
  303.  
  304.   PROCEDURE print_free_rooms(p_start_date DATE, p_end_date DATE)
  305.   IS
  306.     v_room room%ROWTYPE;
  307.     v_reservation reservation%ROWTYPE;
  308.     v_category category%ROWTYPE;
  309.   BEGIN
  310.     DBMS_OUTPUT.PUT_LINE('In period ' || p_start_date || ' - ' || p_end_date || ' free rooms:');
  311.     FOR v_room IN (SELECT * FROM room) LOOP
  312.       DECLARE
  313.         is_found NUMERIC(1) := 0;
  314.       BEGIN
  315.         FOR v_reservation IN (SELECT * FROM reservation) LOOP
  316.           IF v_room.room_id = v_reservation.room_id AND
  317.             NOT (
  318.               (v_reservation.start_date < p_start_date AND v_reservation.end_date < p_start_date)  OR
  319.               (v_reservation.start_date > p_end_date AND v_reservation.end_date > p_end_date)
  320.           ) THEN
  321.             is_found := 1;
  322.           END IF;
  323.         END LOOP;
  324.         IF is_found = 0 THEN
  325.           SELECT
  326.             * INTO v_category
  327.           FROM
  328.             category
  329.           WHERE
  330.             category_id = v_room.category_id;
  331.           DBMS_OUTPUT.PUT_LINE('Room [id=' || v_room.room_id || ', room_no=' || v_room.room_no || ', room_category=[Category [id = ' || v_category.category_id || ', name = ' || v_category.name || '] ]  ]');
  332.         END IF;
  333.       END;
  334.     END LOOP;
  335.   END;
  336.  
  337.   FUNCTION save_new_reservation(
  338.       p_first_name VARCHAR2,
  339.       p_last_name VARCHAR2,
  340.       p_category VARCHAR2,
  341.       p_start_date DATE,
  342.       p_end_date DATE
  343.   )
  344.   RETURN NUMBER
  345.   IS
  346.     v_client client%ROWTYPE;
  347.     v_category category%ROWTYPE;
  348.     v_room room%ROWTYPE;
  349.     v_reservation reservation%ROWTYPE;
  350.   BEGIN
  351.     DBMS_OUTPUT.PUT_LINE('Reservation creating. ');
  352.     -- Searching for client
  353.     BEGIN
  354.       SELECT
  355.           * INTO v_client
  356.       FROM
  357.           client
  358.       WHERE
  359.           client.first_name = p_first_name AND client.last_name = p_last_name;
  360.     EXCEPTION
  361.       WHEN NO_DATA_FOUND THEN
  362.         DBMS_OUTPUT.PUT_LINE('Client not found. Create a new client.');
  363.         INSERT INTO client(first_name, last_name) VALUES (p_first_name, p_last_name);
  364.         SELECT
  365.           * INTO v_client
  366.         FROM
  367.           client
  368.         WHERE
  369.           client.first_name = p_first_name AND client.last_name = p_last_name;
  370.     END;
  371.     DBMS_OUTPUT.PUT_LINE('Found client: Client[id=' || v_client.client_id ||', first_name=' || v_client.first_name ||', last_name=' || v_client.last_name ||'], ');
  372.     -- Searching for category
  373.     BEGIN
  374.       SELECT * INTO v_category
  375.       FROM category
  376.       WHERE category.name = p_category;
  377.     EXCEPTION
  378.       WHEN NO_DATA_FOUND THEN
  379.         Raise_Application_Error (-20343, 'Category not found.');
  380.     END;
  381.     DBMS_OUTPUT.PUT_LINE('Found category: category[id=' || v_category.category_id || ', name=' || v_category.name || ']');
  382.  
  383.     -- Searching free room
  384.     DECLARE
  385.       v_room2 room%ROWTYPE;
  386.       v_reservation2 reservation%ROWTYPE;
  387.     BEGIN
  388.       FOR v_room2 IN (SELECT * FROM room) LOOP
  389.         DECLARE
  390.           is_found NUMERIC(1) := 0;
  391.         BEGIN
  392.           IF v_room2.category_id = v_category.category_id THEN
  393.             FOR v_reservation2 IN (SELECT * FROM reservation) LOOP
  394.               IF v_room2.room_id = v_reservation2.room_id AND
  395.                 NOT (
  396.                   (v_reservation2.start_date < p_start_date AND v_reservation2.end_date < p_start_date)  OR
  397.                   (v_reservation2.start_date > p_end_date AND v_reservation2.end_date > p_end_date)
  398.               )
  399.               THEN
  400.                 is_found := 1;
  401.               END IF;
  402.             END LOOP;
  403.             IF is_found = 0 THEN
  404.               v_room := v_room2;
  405.             END IF;
  406.           END IF;
  407.         END;
  408.       END LOOP;
  409.     END;
  410.  
  411.     -- DBMS_OUTPUT.PUT_LINE('Found room: Room[no=' || v_room.room_no ||']');
  412.  
  413.     IF v_room.room_id IS NULL THEN
  414.       INSERT INTO reservation(client_id, category_id, start_date, end_date, status) VALUES (
  415.         v_client.client_id, v_category.category_id, p_start_date, p_end_date, 'pending'
  416.       );
  417.       DBMS_OUTPUT.PUT_LINE('Reservation created without room. ');
  418.       DBMS_OUTPUT.PUT_LINE('Reservation[');
  419.       DBMS_OUTPUT.PUT_LINE('    id = ' || reservation_id_seq.CURRVAL || ',');
  420.       DBMS_OUTPUT.PUT_LINE('    client=Client[id=' || v_client.client_id || ', first_name=' || v_client.first_name ||', last_name=' || v_client.last_name ||'], ');
  421.       DBMS_OUTPUT.PUT_LINE('    category=category[name=' || v_category.name || ']');
  422.       DBMS_OUTPUT.PUT_LINE(']; ');
  423.     ELSE
  424.       INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night
  425.       ) VALUES (
  426.         v_client.client_id, v_category.category_id, v_room.room_id, p_start_date, p_end_date, 'pending', v_category.price
  427.       );
  428.       DBMS_OUTPUT.PUT_LINE('Reservation created with room. ');
  429.       DBMS_OUTPUT.PUT_LINE('Reservation[');
  430.       -- DBMS_OUTPUT.PUT_LINE('    id = ' || reservation_id_seq.CURRVAL || ',');
  431.       DBMS_OUTPUT.PUT_LINE('    room=Room[no=' || v_room.room_no ||'], ');
  432.       DBMS_OUTPUT.PUT_LINE('    client=Client[id=' || v_client.client_id ||', first_name=' || v_client.first_name ||', last_name=' || v_client.last_name ||'], ');
  433.       DBMS_OUTPUT.PUT_LINE('    category=category[name=' || v_category.name || ']');
  434.       DBMS_OUTPUT.PUT_LINE(']; ');
  435.     END IF;
  436.     RETURN(5);
  437.     -- RETURN(reservation_id_seq.CURRVAL);
  438.   END;
  439.  
  440.   FUNCTION save_new_vip_reservation(
  441.       p_first_name VARCHAR2,
  442.       p_last_name VARCHAR2,
  443.       p_category VARCHAR2,
  444.       p_date DATE
  445.   )
  446.   RETURN NUMBER
  447.   IS
  448.     v_client client%ROWTYPE;
  449.     v_category category%ROWTYPE;
  450.     v_room room%ROWTYPE;
  451.     v_reservation reservation%ROWTYPE;
  452.   BEGIN
  453.     DBMS_OUTPUT.PUT_LINE('Reservation creating. ');
  454.     -- Searching for client
  455.     BEGIN
  456.       SELECT
  457.           * INTO v_client
  458.       FROM
  459.           client
  460.       WHERE
  461.           client.first_name = p_first_name AND client.last_name = p_last_name;
  462.       IF v_client.is_vip = 1 THEN
  463.         Raise_Application_Error (-20343, 'Category is not vip.');
  464.       END IF;
  465.     EXCEPTION
  466.       WHEN NO_DATA_FOUND THEN
  467.         Raise_Application_Error (-20343, 'Client not found.');
  468.     END;
  469.  
  470.     DBMS_OUTPUT.PUT_LINE('Found client: Client[id=' || v_client.client_id ||', first_name=' || v_client.first_name ||', last_name=' || v_client.last_name ||'], ');
  471.     -- Searching for category
  472.     BEGIN
  473.       SELECT * INTO v_category
  474.       FROM category
  475.       WHERE category.name = p_category;
  476.     EXCEPTION
  477.       WHEN NO_DATA_FOUND THEN
  478.         Raise_Application_Error (-20343, 'Category not found.');
  479.     END;
  480.     DBMS_OUTPUT.PUT_LINE('Found category: category[id=' || v_category.category_id || ', name=' || v_category.name || ']');
  481.  
  482.     -- Searching free room
  483.     DECLARE
  484.       v_room2 room%ROWTYPE;
  485.       v_reservation2 reservation%ROWTYPE;
  486.     BEGIN
  487.       FOR v_room2 IN (SELECT * FROM room) LOOP
  488.         DECLARE
  489.           is_found NUMERIC(1) := 0;
  490.         BEGIN
  491.           IF v_room2.category_id = v_category.category_id THEN
  492.             FOR v_reservation2 IN (SELECT * FROM reservation) LOOP
  493.               IF v_room2.room_id = v_reservation2.room_id AND
  494.                 NOT (
  495.                   (v_reservation2.start_date < p_date AND v_reservation2.end_date < p_date)  OR
  496.                   (v_reservation2.start_date > p_date + 1 AND v_reservation2.end_date > p_date + 1)
  497.                 )
  498.               THEN
  499.                 is_found := 1;
  500.               END IF;
  501.             END LOOP;
  502.             IF is_found = 0 THEN
  503.               v_room := v_room2;
  504.             END IF;
  505.           END IF;
  506.         END;
  507.       END LOOP;
  508.     END;
  509.  
  510.     DBMS_OUTPUT.PUT_LINE('Found room: Room[no=' || v_room.room_no ||']');
  511.  
  512.     IF v_room.room_id IS NULL THEN
  513.       DECLARE
  514.         v_room2 room%ROWTYPE;
  515.         v_reservation2 reservation%ROWTYPE;
  516.         v_found_reservation reservation%ROWTYPE;
  517.       BEGIN
  518.         FOR v_room2 IN (SELECT * FROM room) LOOP
  519.           BEGIN
  520.             IF v_room2.category_id = v_category.category_id THEN
  521.               FOR v_reservation2 IN (SELECT * FROM reservation) LOOP
  522.                 IF v_room2.room_id = v_reservation2.room_id AND
  523.                 (
  524.                     (v_reservation2.start_date < p_date AND v_reservation2.end_date < p_date)  OR
  525.                     (v_reservation2.start_date > p_date + 1 AND v_reservation2.end_date > p_date + 1)
  526.                 )
  527.                 THEN
  528.                   v_found_reservation := v_reservation2;
  529.                   v_room := v_room2;
  530.                 END IF;
  531.               END LOOP;
  532.             END IF;
  533.           END;
  534.         END LOOP;
  535.         UPDATE reservation
  536.           SET room_id = NULL
  537.         WHERE reservation_id = v_found_reservation.reservation_id;
  538.       END;
  539.       -- INSERT INTO reservation(client_id, category_id, start_date, end_date, status, price_per_night) VALUES (
  540.       --   v_client.client_id, v_category.category_id, p_start_date, p_end_date, 'pending', v_category.price
  541.       -- );
  542.       DBMS_OUTPUT.PUT_LINE('Reservation created without room. ');
  543.       DBMS_OUTPUT.PUT_LINE('Reservation[');
  544.       DBMS_OUTPUT.PUT_LINE('    id = ' || reservation_id_seq.CURRVAL || ',');
  545.       DBMS_OUTPUT.PUT_LINE('    client=Client[id=' || v_client.client_id || ', first_name=' || v_client.first_name ||', last_name=' || v_client.last_name ||'], ');
  546.       DBMS_OUTPUT.PUT_LINE('    category=category[name=' || v_category.name || ']');
  547.       DBMS_OUTPUT.PUT_LINE(']; ');
  548.     ELSE
  549.       -- INSERT INTO reservation(client_id, category_id, room_id, start_date, end_date, status, price_per_night) VALUES (
  550.       --   v_client.client_id, v_category.category_id, v_room.room_id, p_start_date, p_end_date, 'pending', v_category.price
  551.       -- );
  552.       DBMS_OUTPUT.PUT_LINE('Reservation created with room. ');
  553.       DBMS_OUTPUT.PUT_LINE('Reservation[');
  554.       -- DBMS_OUTPUT.PUT_LINE('    id = ' || reservation_id_seq.CURRVAL || ',');
  555.       DBMS_OUTPUT.PUT_LINE('    room=Room[no=' || v_room.room_no ||'], ');
  556.       DBMS_OUTPUT.PUT_LINE('    client=Client[id=' || v_client.client_id ||', first_name=' || v_client.first_name ||', last_name=' || v_client.last_name ||'], ');
  557.       DBMS_OUTPUT.PUT_LINE('    category=category[name=' || v_category.name ||'], ');
  558.       DBMS_OUTPUT.PUT_LINE(']; ');
  559.     END IF;
  560.     -- RETURN(5);
  561.     RETURN(reservation_id_seq.CURRVAL);
  562.   END;
  563.  
  564.   PROCEDURE client_reception (
  565.       p_first_name VARCHAR,
  566.       p_last_name VARCHAR
  567.   ) IS
  568.     v_reservation reservation%ROWTYPE;
  569.     v_client client%ROWTYPE;
  570.   BEGIN
  571.     DBMS_OUTPUT.PUT_LINE('Client reception');
  572.     BEGIN
  573.       SELECT
  574.           * INTO v_client
  575.       FROM
  576.           client
  577.       WHERE
  578.           client.client_id = v_reservation.client_id;
  579.     EXCEPTION
  580.       WHEN NO_DATA_FOUND THEN
  581.       Raise_Application_Error (-20343, 'Client not found. ');
  582.     END;
  583.  
  584.     FOR v_reservation IN (SELECT * FROM reservation) LOOP
  585.       IF v_reservation.start_date <= SYSDATE AND
  586.         v_reservation.status = 'pending'
  587.         THEN
  588.           UPDATE reservation
  589.             SET status = 'current'
  590.           WHERE reservation_id = v_reservation.reservation_id;
  591.           DBMS_OUTPUT.PUT_LINE('Round reservation: ' ||
  592.             'Reservation[id=' || v_reservation.reservation_id ||
  593.             ', start_date = ' || v_reservation.start_date ||
  594.             ', end_date = ' || v_reservation.end_date || ' ]');
  595.       END IF;
  596.     END LOOP;
  597.   END;
  598.  
  599.   PROCEDURE client_release (
  600.       p_first_name VARCHAR,
  601.       p_last_name VARCHAR
  602.   ) IS
  603.     v_reservation reservation%ROWTYPE;
  604.     v_client client%ROWTYPE;
  605.     v_sum_price NUMBER;
  606.   BEGIN
  607.     DBMS_OUTPUT.PUT_LINE('Client release');
  608.     BEGIN
  609.       SELECT
  610.           * INTO v_client
  611.       FROM
  612.           client
  613.       WHERE
  614.           client.client_id = v_reservation.client_id;
  615.     EXCEPTION
  616.       WHEN NO_DATA_FOUND THEN
  617.       Raise_Application_Error (-20343, 'Client not found. ');
  618.     END;
  619.  
  620.     FOR v_reservation IN (SELECT * FROM reservation) LOOP
  621.       IF v_reservation.status = 'current' THEN
  622.         UPDATE reservation
  623.           SET status = 'finished'
  624.         WHERE reservation_id = v_reservation.reservation_id;
  625.         DBMS_OUTPUT.PUT_LINE('Reservation[id=' || v_reservation.reservation_id ||
  626.           ', start_date = ' || v_reservation.start_date ||
  627.           ', end_date = ' || v_reservation.end_date || ' ]');
  628.         v_sum_price := v_sum_price + ((v_reservation.end_date - v_reservation.start_date) * v_reservation.price_per_night );
  629.       END IF;
  630.       IF count_number_of_visited_per_client(v_client.first_name, v_client.last_name) > 3 THEN
  631.         DBMS_OUTPUT.PUT_LINE('Topay [sum= ' || v_sum_price
  632.           || ', rabat=' || (v_sum_price * 0.1)
  633.           || ', total=' || (v_sum_price - (v_sum_price * 0.1)) || ']');
  634.       ELSE
  635.         DBMS_OUTPUT.PUT_LINE('Topay [sum= ' || v_sum_price || ']');
  636.       END IF;
  637.     END LOOP;
  638.   END;
  639.  
  640.   FUNCTION count_number_of_visited_per_client(
  641.       p_first_name VARCHAR2,
  642.       p_last_Name VARCHAR2
  643.   )
  644.   RETURN NUMBER
  645.   IS
  646.     v_cnt NUMBER := 0;
  647.     v_client client%ROWTYPE;
  648.     v_reservation reservation%ROWTYPE;
  649.   BEGIN
  650.     SELECT
  651.         * INTO v_client
  652.     FROM
  653.         client
  654.     WHERE
  655.         client.first_name = p_first_name AND client.last_name = p_last_name;
  656.     FOR v_reservation IN (SELECT * FROM reservation) LOOP
  657.       IF v_reservation.client_id = v_client.client_id
  658.         THEN
  659.         v_cnt := v_cnt + 1;
  660.       END IF;
  661.     END LOOP;
  662.     RETURN(v_cnt);
  663.   END;
  664.  
  665.   PROCEDURE print_client_today
  666.   IS
  667.     v_client client%ROWTYPE;
  668.     v_reservation reservation%ROWTYPE;
  669.   BEGIN
  670.     DBMS_OUTPUT.PUT_LINE('print_client_today');
  671.     FOR v_reservation IN (SELECT * FROM reservation) LOOP
  672.       IF v_reservation.start_date <= SYSDATE AND
  673.         v_reservation.end_date >= SYSDATE AND
  674.         v_reservation.status = 'pending'
  675.         THEN
  676.         SELECT
  677.             * INTO v_client
  678.         FROM
  679.             client
  680.         WHERE
  681.             client.client_id = v_reservation.client_id;
  682.         DBMS_OUTPUT.PUT_LINE('Client[' || v_client.client_id || '] : ' || v_client.first_name || ' ' || v_client.last_name || ' | Reservation [' || v_reservation.reservation_id || ']  '  || v_reservation.start_date || ' - ' || v_reservation.end_date);
  683.       END IF;
  684.     END LOOP;
  685.   END;
  686.  
  687.   PROCEDURE remove_old_reservations
  688.   IS
  689.     v_reservation reservation%ROWTYPE;
  690.     v_cnt NUMBER := 0;
  691.   BEGIN
  692.     DBMS_OUTPUT.PUT_LINE('remove_old_reservations');
  693.     FOR v_reservation IN (SELECT * FROM reservation) LOOP
  694.       IF v_reservation.end_date < SYSDATE - 5*12*30 THEN
  695.         DELETE FROM reservation WHERE reservation_id = v_reservation.reservation_id;
  696.         v_cnt := v_cnt + 1;
  697.       END IF;
  698.     END LOOP;
  699.     DBMS_OUTPUT.PUT_LINE('Deleted ' || v_cnt || ' reservations');
  700.   END;
  701.  
  702.   PROCEDURE reservation_cancel (
  703.       p_reservation_id NUMBER
  704.   )
  705.   IS
  706.   BEGIN
  707.     DBMS_OUTPUT.PUT_LINE('reservation_cancel');
  708.     DECLARE
  709.       v_employee employee%ROWTYPE;
  710.     BEGIN
  711.       SELECT * INTO v_employee FROM employee WHERE employee_id = get_current_employee_id.Val;
  712.       IF v_employee.role != 'manager' THEN
  713.         Raise_Application_Error (-20343, 'Employee not authorized. ');
  714.       END IF;
  715.       DBMS_OUTPUT.PUT_LINE('Employee authorized.');
  716.     EXCEPTION
  717.       WHEN NO_DATA_FOUND THEN
  718.       Raise_Application_Error (-20343, 'Employee not found.');
  719.     END;
  720.  
  721.     DELETE FROM reservation WHERE reservation_id = p_reservation_id;
  722.     IF SQL%NOTFOUND THEN
  723.       DBMS_OUTPUT.PUT_LINE('Reservation not found.');
  724.     ELSE
  725.       DBMS_OUTPUT.PUT_LINE('Reservation canceled.');
  726.     END IF;
  727.   END;
  728.  
  729.   PROCEDURE reservation_client_raport
  730.   IS
  731.     v_client client%ROWTYPE;
  732.     v_reservation reservation%ROWTYPE;
  733.   BEGIN
  734.     DBMS_OUTPUT.PUT_LINE('Raport generating.');
  735.     FOR v_client IN (SELECT * FROM client) LOOP
  736.       DECLARE
  737.         v_count NUMBER;
  738.         v_sum_night NUMBER;
  739.       BEGIN
  740.         v_count := 0;
  741.         v_sum_night := 0;
  742.         FOR v_reservation IN (SELECT * FROM reservation) LOOP
  743.           IF v_reservation.client_id = v_client.client_id THEN
  744.             v_sum_night := v_sum_night + FLOOR(
  745.                 (TO_DATE(v_reservation.end_date, 'yyyy/mm/dd') - TO_DATE(v_reservation.start_date, 'yyyy/mm/dd'))/365
  746.             );
  747.             v_count := v_count + 1;
  748.           END IF;
  749.         END LOOP;
  750.         BEGIN
  751.           INSERT INTO client_summary (
  752.             client_id, first_name, last_name , how_many_times, how_many_night
  753.           ) VALUES (
  754.               1, v_client.first_name, v_client.last_name , v_count, v_sum_night
  755.           );
  756.           DBMS_OUTPUT.PUT_LINE('Inserted Client[ ' ||
  757.             'client_id='|| v_client.client_id ||', ' ||
  758.             'first_name='|| v_client.first_name ||', ' ||
  759.             'last_name='|| v_client.last_name ||',  ' ||
  760.             'v_sum_day=' || v_sum_night || ', ' ||
  761.             'v_count=' || v_count || ']');
  762.         EXCEPTION
  763.          WHEN DUP_VAL_ON_INDEX THEN
  764.             UPDATE client_summary
  765.             SET    how_many_times = v_count, how_many_night = v_sum_night
  766.             WHERE  client_id = v_client.client_id;
  767.             DBMS_OUTPUT.PUT_LINE('Update Client[ ' ||
  768.               'client_id='|| v_client.client_id ||', ' ||
  769.               'first_name='|| v_client.first_name ||', ' ||
  770.               'last_name='|| v_client.last_name ||',  ' ||
  771.               'v_sum_day=' || v_sum_night || ', ' ||
  772.               'v_count=' || v_count || ']');
  773.         END;
  774.       END;
  775.     END LOOP;
  776.     DBMS_OUTPUT.PUT_LINE('Raport generated.');
  777.   END;
  778. END hotel_mgmt;
  779.  
  780. /
  781. DECLARE
  782.   v_client client%ROWTYPE;
  783. BEGIN
  784.   get_current_employee_id.set_val(2);
  785.   DBMS_OUTPUT.PUT_LINE('Current employee id: ' ||  get_current_employee_id.Val);
  786.   hotel_mgmt.print_client_today;
  787.   hotel_mgmt.print_free_rooms(SYSDATE + 1, SYSDATE + 8);
  788.  
  789.   DBMS_OUTPUT.PUT_LINE('Summary client visit count');
  790.  
  791.   FOR v_client IN (SELECT * FROM client) LOOP
  792.     DBMS_OUTPUT.PUT_LINE(v_client.first_name || ' ' || v_client.last_name || ' = ' ||
  793.       TO_CHAR(hotel_mgmt.count_number_of_visited_per_client(v_client.first_name, v_client.last_name)));
  794.   END LOOP;
  795.  
  796.     DBMS_OUTPUT.PUT_LINE('New client ID = ' ||   hotel_mgmt.save_new_reservation(
  797.        'Jan',
  798.        'Kowalski',
  799.        'Niebieski',
  800.        SYSDATE + 15,
  801.        SYSDATE + 20
  802.    ));
  803.  
  804.    hotel_mgmt.reservation_client_raport;
  805.    hotel_mgmt.reservation_cancel(6);
  806.    hotel_mgmt.remove_old_reservations;
  807.    DBMS_OUTPUT.PUT_LINE('New client ID = ' || hotel_mgmt.new_client('Kamil', 'Bregula', 1));
  808. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement