├── Library.sql ├── Library.xml └── README.md /Library.sql: -------------------------------------------------------------------------------- 1 | --LIBRARY PROJECT-- 2 | 3 | --CREATE TABLES-- 4 | CREATE TABLE Card( 5 | cardID NUMBER, 6 | status VARCHAR2(1) CHECK ((status = 'A') OR (status = 'B')), 7 | fines NUMBER, 8 | CONSTRAINT Card_PK PRIMARY KEY (cardID)); 9 | 10 | CREATE TABLE Customer( 11 | customerID NUMBER, 12 | name VARCHAR2(40), 13 | customerAddress VARCHAR2(50), 14 | phone NUMBER(9), 15 | password VARCHAR2(20), 16 | userName VARCHAR2(10), 17 | dateSignUp DATE, 18 | cardNumber NUMBER, 19 | CONSTRAINT Customer_PK PRIMARY KEY (customerID)); 20 | 21 | CREATE TABLE Employee( 22 | employeeID NUMBER, 23 | name VARCHAR2(40), 24 | employeeAddress VARCHAR2(50), 25 | phone NUMBER(9), 26 | password VARCHAR2(20), 27 | userName VARCHAR2(10), 28 | paycheck NUMBER (8, 2), 29 | branchName VARCHAR2(40), 30 | cardNumber NUMBER, 31 | CONSTRAINT Employee_PK PRIMARY KEY (employeeID)); 32 | 33 | CREATE TABLE Branch( 34 | name VARCHAR2(40), 35 | address VARCHAR2(50), 36 | phone NUMBER(9), 37 | CONSTRAINT Branch_PK PRIMARY KEY (name)); 38 | 39 | CREATE TABLE Location( 40 | address VARCHAR2(50), 41 | CONSTRAINT Location_PK PRIMARY KEY (address)); 42 | 43 | CREATE TABLE Rent( 44 | cardID NUMBER, 45 | itemID VARCHAR2(6), 46 | apporpriationDate DATE, 47 | returnDate DATE, 48 | CONSTRAINT Rent_PK PRIMARY KEY (cardID,itemID)); 49 | 50 | CREATE TABLE Book( 51 | ISBN VARCHAR2(4), 52 | bookID VARCHAR2(6), 53 | state VARCHAR2(10), 54 | avalability VARCHAR2(1) CHECK ((avalability = 'A') OR (avalability = 'O')), 55 | debyCost NUMBER(10,2), 56 | lostCost NUMBER(10,2), 57 | address VARCHAR2(50), 58 | CONSTRAINT Book_PK PRIMARY KEY (ISBN,bookID)); 59 | 60 | CREATE TABLE Video( 61 | title VARCHAR2(50), 62 | year INT, 63 | videoID VARCHAR2(6), 64 | state VARCHAR2(10), 65 | avalability VARCHAR2(1) CHECK ((avalability = 'A') OR (avalability = 'O')), 66 | debyCost NUMBER(10,2), 67 | lostCost NUMBER(10,2), 68 | address VARCHAR(50), 69 | CONSTRAINT Video_PK PRIMARY KEY (title,year,videoID)); 70 | 71 | 72 | --SELECT-- 73 | SELECT * FROM Card; 74 | SELECT * FROM Customer; 75 | SELECT * FROM Employee; 76 | SELECT * FROM Branch; 77 | SELECT * FROM Location; 78 | SELECT * FROM Book; 79 | SELECT * FROM Video; 80 | SELECT * FROM Rent; 81 | 82 | 83 | --DROP TABLES-- 84 | DROP TABLE Card; 85 | DROP TABLE Customer; 86 | DROP TABLE Employee; 87 | DROP TABLE Branch; 88 | DROP TABLE Location; 89 | DROP TABLE Book; 90 | DROP TABLE Video; 91 | DROP TABLE Rent; 92 | 93 | 94 | --FOREIGN KEYS-- 95 | ALTER TABLE Customer 96 | ADD CONSTRAINT Customer_FK 97 | FOREIGN KEY (cardNumber) 98 | REFERENCES Card(cardID); 99 | 100 | ALTER TABLE Employee 101 | ADD CONSTRAINT Employee_FK_Card 102 | FOREIGN KEY (cardNumber) 103 | REFERENCES Card(cardID); 104 | 105 | ALTER TABLE Employee 106 | ADD CONSTRAINT Employee_FK_Branch 107 | FOREIGN KEY (branchName) 108 | REFERENCES Branch(name); 109 | 110 | ALTER TABLE Branch 111 | ADD CONSTRAINT Branch_FK 112 | FOREIGN KEY (address) 113 | REFERENCES Location(address); 114 | 115 | ALTER TABLE Book 116 | ADD CONSTRAINT Book_FK 117 | FOREIGN KEY (address) 118 | REFERENCES Location(address); 119 | 120 | ALTER TABLE Video 121 | ADD CONSTRAINT Video_FK 122 | FOREIGN KEY (address) 123 | REFERENCES Location(address); 124 | 125 | ALTER TABLE Rent 126 | ADD CONSTRAINT Rent_FK_Card 127 | FOREIGN KEY (cardID) 128 | REFERENCES Card(cardID); 129 | 130 | ALTER TABLE Rent 131 | ADD CONSTRAINT Rent_FK_Book 132 | FOREIGN KEY (itemID) 133 | REFERENCES Book(bookID); 134 | 135 | ALTER TABLE Rent 136 | ADD CONSTRAINT Rent_FK_Video 137 | FOREIGN KEY (itemID) 138 | REFERENCES Video(videoID); 139 | 140 | 141 | --INSERTS-- 142 | INSERT INTO Card VALUES (101,'A',0); 143 | INSERT INTO Card VALUES (102,'A',0); 144 | INSERT INTO Card VALUES (103,'A',0); 145 | INSERT INTO Card VALUES (104,'A',0); 146 | INSERT INTO Card VALUES (105,'A',0); 147 | INSERT INTO Card VALUES (106,'A',0); 148 | INSERT INTO Card VALUES (107,'B',50); 149 | INSERT INTO Card VALUES (108,'B',10); 150 | INSERT INTO Card VALUES (109,'B',25.5); 151 | INSERT INTO Card VALUES (110,'B',15.25); 152 | INSERT INTO Card VALUES (151,'A',0); 153 | INSERT INTO Card VALUES (152,'A',0); 154 | INSERT INTO Card VALUES (153,'A',0); 155 | INSERT INTO Card VALUES (154,'A',0); 156 | INSERT INTO Card VALUES (155,'A',0); 157 | 158 | INSERT INTO Branch VALUES ('ARCHEOLOGY', 'ARCHEOLOGY ROAD', 645645645); 159 | INSERT INTO Branch VALUES ('CHEMISTRY', 'CHEMISTRY ROAD', 622622622); 160 | INSERT INTO Branch VALUES ('COMPUTING', 'COMPUTING ROAD', 644644644); 161 | INSERT INTO Branch VALUES ('PHYSICS', 'PHYSICS ROAD', 666666666); 162 | 163 | INSERT INTO Customer VALUES (1, 'ALFRED', 'BACON STREET', 623623623, 'alfred123', 'al1', '12-05-2018', 101); 164 | INSERT INTO Customer VALUES (2, 'JAMES', 'DOWNTOWN ABBEY', 659659659, 'james123', 'ja2', '10-05-2018', 102); 165 | INSERT INTO Customer VALUES (3, 'GEORGE', 'DETROIT CITY', 654654654, 'george123', 'ge3', '21-06-2017', 103); 166 | INSERT INTO Customer VALUES (4, 'TOM', 'WASHINGTON DC.', 658658658, 'tom123', 'tom4', '05-12-2016', 104); 167 | INSERT INTO Customer VALUES (5, 'PETER', 'CASTERLY ROCK', 652652652, 'peter123', 'pe5', '09-08-2016', 105); 168 | INSERT INTO Customer VALUES (6, 'JENNY', 'TERRAKOTA', 651651651, 'jenny123', 'je6', '30-04-2017', 106); 169 | INSERT INTO Customer VALUES (7, 'ROSE', 'SWEET HOME ALABAMA', 657657657, 'rose123', 'ro7', '28-02-2018', 107); 170 | INSERT INTO Customer VALUES (8, 'MONICA', 'FAKE STREET 123', 639639639, 'monica123', 'mo8', '15-01-2016', 108); 171 | INSERT INTO Customer VALUES (9, 'PHOEBE', 'CENTRAL PERK', 678678678, 'phoebe123', 'pho9', '25-03-2016', 109); 172 | INSERT INTO Customer VALUES (10, 'RACHEL', 'WHEREVER', 687687687, 'rachel123', 'ra10', '01-09-2017', 110); 173 | 174 | INSERT INTO Employee VALUES (211, 'ROSS', 'HIS HOUSE', 671671671, 'ross123', 'ro11', 1200, 'ARCHEOLOGY', 551); 175 | INSERT INTO Employee VALUES (212, 'CHANDLER', 'OUR HEARTHS', 688688688, 'chandler123', 'chand12', 1150.50, 'ARCHEOLOGY', 552); 176 | INSERT INTO Employee VALUES (213, 'JOEY', 'LITTLE ITAYLY', 628628628, 'joey123', 'jo13', 975.75, 'ARCHEOLOGY', 553); 177 | INSERT INTO Employee VALUES (214, 'VICTOR', 'SANTA FE', 654321987, 'victor123', 'vic14', 2200, 'COMPUTING', 554); 178 | INSERT INTO Employee VALUES (215, 'JAIRO', 'ARMILLA', 698754321, 'jairo123', 'ja15', 2200.50, 'CHEMISTRY', 555); 179 | 180 | INSERT INTO Location VALUES ('ARCHEOLOGY ROAD'); 181 | INSERT INTO Location VALUES ('CHEMISTRY ROAD'); 182 | INSERT INTO Location VALUES ('COMPUTING ROAD'); 183 | INSERT INTO Location VALUES ('PHYSICS ROAD'); 184 | 185 | INSERT INTO Book VALUES ('A123', 'B1A123', 'GOOD', 'A', 5, 20, 'ARCHEOLOGY ROAD'); 186 | INSERT INTO Book VALUES ('A123', 'B2A123', 'NEW', 'O', 6, 30, 'ARCHEOLOGY ROAD'); 187 | INSERT INTO Book VALUES ('B234', 'B1B234', 'NEW', 'A', 2, 15, 'CHEMISTRY ROAD'); 188 | INSERT INTO Book VALUES ('C321', 'B1C321', 'BAD', 'A', 1, 10, 'PHYSICS ROAD'); 189 | INSERT INTO Book VALUES ('H123', 'B1H123', 'GOOD', 'A', 3, 15, 'CHEMISTRY ROAD'); 190 | INSERT INTO Book VALUES ('Z123', 'B1Z123', 'GOOD', 'O', 4, 20, 'COMPUTING ROAD'); 191 | INSERT INTO Book VALUES ('L321', 'B1L321', 'NEW', 'O', 4, 20, 'COMPUTING ROAD'); 192 | INSERT INTO Book VALUES ('P321', 'B1P321', 'USED', 'A', 2, 12, 'CHEMISTRY ROAD'); 193 | 194 | INSERT INTO Video VALUES ('CHEMISTRY FOR DUMMIES', 2016, 'V1CH16', 'NEW', 'O', 10, 50, 'CHEMISTRY ROAD'); 195 | INSERT INTO Video VALUES ('CHEMISTRY FOR DUMMIES', 2016, 'V2CH16', 'BAD', 'A', 5, 20, 'CHEMISTRY ROAD'); 196 | INSERT INTO Video VALUES ('COMPUTING MANAGER', 2014, 'V1CO14', 'GOOD', 'A', 4, 20, 'COMPUTING ROAD'); 197 | INSERT INTO Video VALUES ('JAVA LANGUAGE', 2015, 'V1JA15', 'USED', 'O', 4, 20, 'COMPUTING ROAD'); 198 | INSERT INTO Video VALUES ('DINOSAURS', 2000, 'V1DI00', 'GOOD', 'O', 5, 25, 'ARCHEOLOGY ROAD'); 199 | INSERT INTO Video VALUES ('T-REX, DEADLY KING', 1992, 'V1TR92', 'USED', 'A', 10, 50, 'ARCHEOLOGY ROAD'); 200 | INSERT INTO Video VALUES ('ANCESTORS OF THE HUMANITY', 1998, 'V1AN98', 'BAD', 'A', 3, 15, 'ARCHEOLOGY ROAD'); 201 | INSERT INTO Video VALUES ('PHYSICS, MOST BORING SH*T', 2018, 'V1PH18', 'NEW', 'A', 1, 5, 'PHYSICS ROAD'); 202 | 203 | INSERT INTO Rent VALUES (101, 'B2A123', '10-05-2018', '20-05-2018'); 204 | INSERT INTO Rent VALUES (102, 'B1Z123', '10-05-2018', '25-05-2018'); 205 | INSERT INTO Rent VALUES (104, 'V1JA15', '01-05-2018', '21-05-2018'); 206 | INSERT INTO Rent VALUES (105, 'V1DI00', '02-05-2018', '25-05-2018'); 207 | INSERT INTO Rent VALUES (154, 'B1L321', '04-05-2018', '26-05-2018'); 208 | INSERT INTO Rent VALUES (155, 'V1CH16', '29-04-2018', '29-05-2018'); 209 | 210 | 211 | --FUNCTIONS-- 212 | --1-- 213 | --CUSTOMER-- 214 | CREATE OR REPLACE PROCEDURE loginCustomer_library(user IN VARCHAR2, pass IN VARCHAR2) 215 | IS 216 | passAux customer.password%TYPE; 217 | incorrect_password EXCEPTION; 218 | BEGIN 219 | 220 | 221 | SELECT password INTO passAux 222 | FROM customer 223 | WHERE username LIKE user; 224 | 225 | IF passAux LIKE pass THEN 226 | DBMS_OUTPUT.PUT_LINE('User ' || user || ' loging succesfull'); 227 | ELSE 228 | RAISE incorrect_password; 229 | END IF; 230 | 231 | EXCEPTION 232 | WHEN no_data_found OR incorrect_password THEN 233 | DBMS_OUTPUT.PUT_LINE('Incorrect username or password'); 234 | 235 | END; 236 | 237 | SET SERVEROUTPUT ON; 238 | DECLARE 239 | user customer.username%TYPE; 240 | pass customer.password%TYPE; 241 | BEGIN 242 | user := &Username; 243 | pass := &Password; 244 | login_library(user,pass); 245 | END; 246 | 247 | 248 | --EMPLOYEE- 249 | CREATE OR REPLACE PROCEDURE loginEmployee_library(user IN VARCHAR2, pass IN VARCHAR2) 250 | IS 251 | passAux employee.password%TYPE; 252 | incorrect_password EXCEPTION; 253 | BEGIN 254 | SELECT password INTO passAux 255 | FROM employee 256 | WHERE username LIKE user; 257 | 258 | IF passAux LIKE pass THEN 259 | DBMS_OUTPUT.PUT_LINE('User ' || user || ' loging succesfull'); 260 | ELSE 261 | RAISE incorrect_password; 262 | END IF; 263 | 264 | EXCEPTION 265 | WHEN no_data_found OR incorrect_password THEN 266 | DBMS_OUTPUT.PUT_LINE('Incorrect username or password'); 267 | END; 268 | 269 | SET SERVEROUTPUT ON; 270 | DECLARE 271 | user employee.username%TYPE; 272 | pass employee.password%TYPE; 273 | BEGIN 274 | user := &Username; 275 | pass := &Password; 276 | login_employee_library(user,pass); 277 | END; 278 | 279 | 280 | 281 | --2-- 282 | CREATE OR REPLACE PROCEDURE viewItem_library(auxItemID IN VARCHAR2) 283 | IS 284 | auxISBN VARCHAR2(4); 285 | auxTitle VARCHAR2(50); 286 | auxYear NUMBER; 287 | auxState VARCHAR2(10); 288 | auxDebyCost NUMBER(10,2); 289 | auxLostCost NUMBER(10,2); 290 | auxAddress VARCHAR2(50); 291 | auxAbala VARCHAR2(1); 292 | auxVideo NUMBER; 293 | auxBook NUMBER; 294 | BEGIN 295 | 296 | SELECT COUNT(*) INTO auxBook 297 | FROM book 298 | WHERE bookid LIKE auxItemID; 299 | 300 | SELECT COUNT(*) INTO auxVideo 301 | FROM video 302 | WHERE videoid LIKE auxItemID; 303 | 304 | IF auxBook > 0 THEN 305 | SELECT isbn, state, avalability, debycost, lostcost, address 306 | INTO auxISBN, auxState, auxAbala, auxDebyCost, auxLostCost, auxAddress 307 | FROM book 308 | WHERE bookid LIKE auxItemID; 309 | 310 | DBMS_OUTPUT.PUT_LINE('BOOK ' || auxItemID || ' INFO'); 311 | DBMS_OUTPUT.PUT_LINE('------------------------------------------'); 312 | DBMS_OUTPUT.PUT_LINE('ISBN: ' || auxISBN); 313 | DBMS_OUTPUT.PUT_LINE('STATE: ' || auxState); 314 | DBMS_OUTPUT.PUT_LINE('AVALABILITY: ' || auxAbala); 315 | DBMS_OUTPUT.PUT_LINE('DEBY COST: ' || auxDebyCost); 316 | DBMS_OUTPUT.PUT_LINE('LOST COST: ' || auxLostCost); 317 | DBMS_OUTPUT.PUT_LINE('ADDRESS: ' || auxAddress); 318 | DBMS_OUTPUT.PUT_LINE('------------------------------------------'); 319 | ELSIF auxVideo > 0 THEN 320 | SELECT title, year, state, avalability, debycost, lostcost, address 321 | INTO auxTitle, auxYear, auxState, auxAbala, auxDebyCost, auxLostCost, auxAddress 322 | FROM video 323 | WHERE videoid LIKE auxItemID; 324 | 325 | DBMS_OUTPUT.PUT_LINE('VIDEO ' || auxItemID || ' INFO'); 326 | DBMS_OUTPUT.PUT_LINE('------------------------------------------'); 327 | DBMS_OUTPUT.PUT_LINE('TITLE: ' || auxTitle); 328 | DBMS_OUTPUT.PUT_LINE('YEAR: ' || auxYear); 329 | DBMS_OUTPUT.PUT_LINE('STATE: ' || auxState); 330 | DBMS_OUTPUT.PUT_LINE('AVALABILITY: ' || auxAbala); 331 | DBMS_OUTPUT.PUT_LINE('DEBY COST: ' || auxDebyCost); 332 | DBMS_OUTPUT.PUT_LINE('LOST COST: ' || auxLostCost); 333 | DBMS_OUTPUT.PUT_LINE('ADDRESS: ' || auxAddress); 334 | DBMS_OUTPUT.PUT_LINE('------------------------------------------'); 335 | END IF; 336 | END; 337 | 338 | SET SERVEROUTPUT ON; 339 | DECLARE 340 | auxItemID VARCHAR2(10); 341 | BEGIN 342 | auxItemID := &Item_ID; 343 | viewItem_library(auxItemID); 344 | END; 345 | 346 | 347 | 348 | --3-- 349 | --CUSTOMER-- 350 | CREATE OR REPLACE PROCEDURE customerAccount_library(custoID IN customer.customerid%TYPE) 351 | IS 352 | auxCard NUMBER; 353 | auxFines NUMBER; 354 | auxItem VARCHAR(6); 355 | rented number := 0; 356 | BEGIN 357 | SELECT cardnumber INTO auxCard 358 | FROM customer 359 | WHERE customerid LIKE custoID; 360 | 361 | SELECT COUNT(*) INTO rented 362 | FROM rent 363 | WHERE rent.cardid LIKE auxcard; 364 | 365 | DBMS_OUTPUT.PUT_LINE('The user card is ' || auxCard); 366 | IF (rented > 0) THEN 367 | SELECT rent.itemid INTO auxItem 368 | FROM rent,card 369 | WHERE card.cardid = rent.cardid 370 | AND card.cardid LIKE auxCard; 371 | 372 | DBMS_OUTPUT.PUT_LINE('The user has ' || auxItem || ' rented'); 373 | ELSE 374 | DBMS_OUTPUT.PUT_LINE('This user has no rents'); 375 | END IF; 376 | 377 | SELECT fines INTO auxFines 378 | FROM card 379 | WHERE cardid LIKE auxcard; 380 | 381 | DBMS_OUTPUT.PUT_LINE('The user fines are ' || auxFines); 382 | 383 | EXCEPTION WHEN no_data_found THEN 384 | DBMS_OUTPUT.PUT_LINE('NOT DATA FOUND'); 385 | END; 386 | 387 | SET SERVEROUTPUT ON; 388 | DECLARE 389 | custoID customer.customerid%TYPE; 390 | BEGIN 391 | custoID := &Customer_ID; 392 | customerAcount_library(custoID); 393 | END; 394 | 395 | 396 | --EMPLOYEE-- 397 | CREATE OR REPLACE PROCEDURE employeeAccount_library(emploID IN employee.employeeid%TYPE) 398 | IS 399 | auxCard NUMBER; 400 | auxFines NUMBER; 401 | auxItem VARCHAR(6); 402 | rented number := 0; 403 | BEGIN 404 | SELECT cardnumber INTO auxCard 405 | FROM employee 406 | WHERE employeeid LIKE emploID; 407 | 408 | SELECT COUNT(*) INTO rented 409 | FROM rent 410 | WHERE rent.cardid LIKE auxcard; 411 | 412 | DBMS_OUTPUT.PUT_LINE('The user card is ' || auxCard); 413 | IF (rented > 0) THEN 414 | SELECT rent.itemid INTO auxItem 415 | FROM rent,card 416 | WHERE card.cardid = rent.cardid 417 | AND card.cardid LIKE auxCard; 418 | 419 | DBMS_OUTPUT.PUT_LINE('The user has ' || auxItem || ' rented'); 420 | ELSE 421 | DBMS_OUTPUT.PUT_LINE('This user has no rents'); 422 | END IF; 423 | 424 | SELECT fines INTO auxFines 425 | FROM card 426 | WHERE cardid LIKE auxcard; 427 | 428 | DBMS_OUTPUT.PUT_LINE('The user fines are ' || auxFines); 429 | 430 | EXCEPTION WHEN no_data_found THEN 431 | DBMS_OUTPUT.PUT_LINE('NOT DATA FOUND'); 432 | END; 433 | 434 | SET SERVEROUTPUT ON; 435 | DECLARE 436 | emploID employee.employeeid%TYPE; 437 | BEGIN 438 | emploID := &Employee_ID; 439 | employeeAcount_library(emploID); 440 | END; 441 | 442 | 443 | 444 | --4-- 445 | CREATE OR REPLACE PROCEDURE rentItem_library(auxCard IN NUMBER, auxItemID IN VARCHAR2, itemType IN VARCHAR2, auxDate IN DATE) 446 | IS 447 | statusAux VARCHAR2(1); 448 | itemStatus VARCHAR2(1); 449 | BEGIN 450 | 451 | SELECT status INTO statusAux 452 | FROM card 453 | WHERE cardid LIKE auxCard; 454 | 455 | IF statusAux LIKE 'A' THEN 456 | IF itemType LIKE 'book' THEN 457 | SELECT avalability INTO itemStatus 458 | FROM book 459 | WHERE bookid LIKE auxItemID; 460 | 461 | IF itemStatus LIKE 'A' THEN 462 | UPDATE book 463 | SET avalability = 'O' 464 | WHERE bookid LIKE auxItemID; 465 | 466 | INSERT INTO rent 467 | VALUES (auxCard,auxItemID,sysdate,auxDate); 468 | DBMS_OUTPUT.PUT_LINE('Item ' || auxItemID || ' rented'); 469 | ELSE 470 | DBMS_OUTPUT.PUT_LINE('The item is already rented') 471 | END IF; 472 | 473 | ELSIF itemType LIKE 'video' THEN 474 | 475 | SELECT avalability INTO itemStatus 476 | FROM video 477 | WHERE videoid LIKE auxItemID; 478 | 479 | IF itemStatus LIKE 'A' THEN 480 | UPDATE video 481 | SET avalability = 'O' 482 | WHERE videoid LIKE auxItemID; 483 | 484 | INSERT INTO rent 485 | VALUES (auxCard,auxItemID,sysdate,auxDate); 486 | DBMS_OUTPUT.PUT_LINE('Item ' || auxItemID || ' rented'); 487 | ELSE 488 | DBMS_OUTPUT.PUT_LINE('The item is already rented') 489 | END IF; 490 | 491 | ELSE 492 | DBMS_OUTPUT.PUT_LINE('The user is blocked'); 493 | END IF; 494 | END; 495 | 496 | SET SERVEROUTPUT ON; 497 | DECLARE 498 | auxCard NUMBER; 499 | auxItemID VARCHAR2(10); 500 | itemType VARCHAR2(20); 501 | auxDate DATE; 502 | BEGIN 503 | auxCard := &Card_ID; 504 | itemType := &Item_Type_book_or_video; 505 | auxItemID := &ID_Item; 506 | auxDate := &Return_date; 507 | rentItem_library(auxCard,auxItemID,itemType,auxDate); 508 | END; 509 | 510 | SELECT * FROM customer; 511 | SELECT * FROM rent; 512 | SELECT * FROM card; 513 | 514 | 515 | 516 | --5-- 517 | CREATE OR REPLACE PROCEDURE payFines_library(auxCard IN card.cardid%TYPE, money IN NUMBER) 518 | IS 519 | finesAmount NUMBER; 520 | total NUMBER; 521 | BEGIN 522 | SELECT fines INTO finesAmount 523 | FROM card 524 | WHERE cardid LIKE auxCard; 525 | 526 | IF finesAmount < money THEN 527 | total := money - finesAmount; 528 | DBMS_OUTPUT.PUT_LINE('YOU PAY ALL YOUR FINES AND YOU HAVE ' || total || ' MONEY BACK'); 529 | 530 | UPDATE card 531 | SET status = 'A', fines = 0 532 | WHERE cardid = auxCard; 533 | 534 | ELSIF finesAmount = money THEN 535 | total := money - finesAmount; 536 | DBMS_OUTPUT.PUT_LINE('YOU PAY ALL YOUR FINES'); 537 | 538 | UPDATE card 539 | SET status = 'A', fines = 0 540 | WHERE cardid = auxCard; 541 | 542 | ELSE 543 | total := finesAmount - money; 544 | DBMS_OUTPUT.PUT_LINE('YOU WILL NEED TO PAY ' || total || ' MORE DOLLARS TO UNLOCK YOUR CARD'); 545 | 546 | UPDATE card 547 | SET fines = total 548 | WHERE cardid = auxCard; 549 | END IF; 550 | END; 551 | 552 | SET SERVEROUTPUT ON; 553 | DECLARE 554 | auxCard card.cardid%TYPE; 555 | money NUMBER; 556 | BEGIN 557 | auxCard := &Card_ID; 558 | money := &Money_To_Pay; 559 | payFines_library(custoID); 560 | END; 561 | 562 | 563 | 564 | --6-- 565 | --CUSTOMER-- 566 | CREATE OR REPLACE PROCEDURE updateInfoCusto_library(auxCustomer IN customer.customerid%TYPE, pNumber NUMBER, address VARCHAR2, newPass VARCHAR2) 567 | IS 568 | BEGIN 569 | UPDATE customer 570 | SET phone = pNumber, customeraddress = address, password = newPass 571 | WHERE customerid = auxCustomer; 572 | END; 573 | 574 | SET SERVEROUTPUT ON; 575 | DECLARE 576 | auxCustomer customer.customerid%TYPE; 577 | pNumber NUMBER; 578 | address VARCHAR2; 579 | newPass VARCHAR2; 580 | BEGIN 581 | auxCustomer := &Customer_ID; 582 | pNumber := &Write_your_new_phone_number_or_the_old_one_if_you_do_not_want_to_change_it; 583 | address := &Write_your_new_address_or_the_old_one_if_you_do_not_want_to_change_it; 584 | newPass := &Write_your_new_password_or_the_old_one_if_you_do_not_want_to_change_it; 585 | updateInfo_library(auxCustomer,pNumber,address,newPass); 586 | END; 587 | 588 | --EMPLOYEE-- 589 | CREATE OR REPLACE PROCEDURE updateInfoEmp_library(auxEmployee IN employee.employeeid%TYPE, pNumber NUMBER, address VARCHAR2, newPass VARCHAR2, newPayCheck NUMBER, 590 | newBranch VARCHAR2) 591 | IS 592 | BEGIN 593 | UPDATE employee 594 | SET phone = pNumber, customeraddress = address, password = newPass, paycheck = auxEmployee, branchname = newBranch 595 | WHERE employeeid = auxEmployee; 596 | END; 597 | 598 | SET SERVEROUTPUT ON; 599 | DECLARE 600 | auxEmployee emplouee.employeeid%TYPE; 601 | pNumber NUMBER; 602 | address VARCHAR2; 603 | newPass VARCHAR2; 604 | newPayCheck NUMBER; 605 | newBranch VARCHAR2; 606 | BEGIN 607 | auxCustomer := &Customer_ID; 608 | pNumber := &Write_your_new_phone_number_or_the_old_one_if_you_do_not_want_to_change_it; 609 | address := &Write_your_new_address_or_the_old_one_if_you_do_not_want_to_change_it; 610 | newPass := &Write_your_new_password_or_the_old_one_if_you_do_not_want_to_change_it; 611 | newPayCheck := &Write_your_new_paycheck_or_the_old_one_if_you_do_not_want_to_change_it; 612 | newBranch := &Write_your_new_branch_or_the_old_one_if_you_do_not_want_to_change_it; 613 | updateInfoEmployee_library(auxCustomer,pNumber,address,newPass,newPayCheck,newBranch); 614 | END; 615 | 616 | 617 | 618 | --7-- 619 | CREATE OR REPLACE PROCEDURE addCustomer_library(auxCustomerId IN NUMBER, auxName IN VARCHAR2, auxCustomerAddress IN VARCHAR2, auxPhone IN NUMBER, 620 | auxPass IN VARCHAR2, auxUserName IN VARCHAR2, auxCardNumber IN NUMBER) 621 | IS 622 | BEGIN 623 | INSERT INTO customer 624 | VALUES (auxCustomerId,auxName,auxCustomerAddress,auxPhone,auxPass,auxUserName,sysdate,auxCardNumber); 625 | END; 626 | 627 | SET SERVEROUTPUT ON; 628 | DECLARE 629 | auxCustomerId NUMBER; 630 | auxName VARCHAR2(20); 631 | auxCustomerAddress VARCHAR2(20); 632 | auxPhone NUMBER; 633 | auxPass VARCHAR2(20); 634 | auxUserName VARCHAR2(20); 635 | auxCardNumber NUMBER; 636 | BEGIN 637 | auxCustomerId := &Customer_ID; 638 | auxName := &Name; 639 | auxCustomerAddress := &Address; 640 | auxPhone := &Phone; 641 | auxPass := &Password; 642 | auxUserName := &User_Name; 643 | auxCardNumber := &Card_Numeber; 644 | addCustomer_library(auxCustomerId,auxName,auxCustomerAddress,auxPhone,auxPass,auxUserName,auxCardNumber); 645 | END; 646 | 647 | 648 | 649 | --8-- 650 | --CUSTOMER-- 651 | CREATE OR REPLACE TRIGGER addCardCusto_library 652 | AFTER INSERT 653 | ON customer 654 | FOR EACH ROW 655 | DECLARE 656 | BEGIN 657 | INSERT INTO card 658 | VALUES (:new.cardnumber,'A',0); 659 | 660 | DBMS_OUTPUT.PUT_LINE('Card created'); 661 | END; 662 | 663 | --EMPLOYEE-- 664 | CREATE OR REPLACE TRIGGER addCardEmp_library 665 | AFTER INSERT 666 | ON employee 667 | FOR EACH ROW 668 | DECLARE 669 | BEGIN 670 | INSERT INTO card 671 | VALUES (:new.cardnumber,'A',0); 672 | 673 | DBMS_OUTPUT.PUT_LINE('Card created'); 674 | END; 675 | 676 | --EXAMPLE-- 677 | INSERT INTO customer 678 | VALUES (11,'MARI CARMEN','CORDOBA',645892456,'maricarmen123','ma11',sysdate,111); 679 | 680 | 681 | 682 | --9-- 683 | CREATE OR REPLACE PROCEDURE allMedia_library(mediaType VARCHAR2) 684 | IS 685 | CURSOR cBooks 686 | IS 687 | SELECT * 688 | FROM book; 689 | 690 | CURSOR cVideos 691 | IS 692 | SELECT * 693 | FROM video; 694 | 695 | xBooks cBooks%ROWTYPE; 696 | xVideos cVideos%ROWTYPE; 697 | BEGIN 698 | IF mediaType LIKE 'books' THEN 699 | OPEN cBooks; 700 | 701 | DBMS_OUTPUT.PUT_LINE('ISBN ID STATE AVALABILITY DEBY_COST LOST_COST LOCATION'); 702 | DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------------------------'); 703 | 704 | LOOP 705 | FETCH cBooks 706 | INTO xBooks; 707 | EXIT WHEN cBooks%NOTFOUND; 708 | 709 | DBMS_OUTPUT.PUT_LINE(xBooks.isbn || ' ' || xBooks.bookid || ' ' || xBooks.state || ' ' || xBooks.avalability || ' ' || xBooks.debycost || ' ' || 710 | xBooks.lostcost || ' ' || xBooks.address); 711 | END LOOP; 712 | ELSIF mediaType LIKE 'videos' THEN 713 | OPEN cVideos; 714 | DBMS_OUTPUT.PUT_LINE('TITLE YEAR ID STATE AVALABILITY DEBY_COST LOST_COST LOCATION'); 715 | DBMS_OUTPUT.PUT_LINE('---------------------------------------------------------------------------------------'); 716 | LOOP 717 | FETCH cVideos 718 | INTO xVideos; 719 | EXIT WHEN cVideos%NOTFOUND; 720 | 721 | DBMS_OUTPUT.PUT_LINE(xVideos.title || ' ' || xVideos.year || ' ' || xVideos.videoid || ' ' || xVideos.state || ' ' || xVideos.avalability || ' ' || xVideos.debycost || ' ' || 722 | xVideos.lostcost || ' ' || xVideos.address); 723 | END LOOP; 724 | ELSE 725 | DBMS_OUTPUT.PUT_LINE('TYPE INCORRECT, you must choose between books or videos'); 726 | END IF; 727 | END; 728 | 729 | SET SERVEROUTPUT ON; 730 | DECLARE 731 | typeItem VARCHAR2(10); 732 | BEGIN 733 | typeItem := &Select_between_books_or_videos; 734 | allMedia_library(typeItem); 735 | END; 736 | 737 | 738 | 739 | --10-- 740 | CREATE OR REPLACE PROCEDURE handleReturns_library(auxItemID IN VARCHAR2) 741 | IS 742 | auxRented NUMBER; 743 | auxBook NUMBER; 744 | auxVideo NUMBER; 745 | BEGIN 746 | SELECT COUNT(*) INTO auxRented 747 | FROM rent 748 | WHERE itemid LIKE auxItemID; 749 | 750 | SELECT COUNT(*) INTO auxBook 751 | FROM book 752 | WHERE bookid LIKE auxItemID; 753 | 754 | SELECT COUNT(*) INTO auxVideo 755 | FROM video 756 | WHERE videoid LIKE auxItemID; 757 | 758 | IF auxRented > 0 THEN 759 | DELETE FROM rent 760 | WHERE itemid = auxItemID; 761 | IF auxBook > 0 THEN 762 | UPDATE book 763 | SET avalability = 'A' 764 | WHERE bookid LIKE auxItemID; 765 | DBMS_OUTPUT.PUT_LINE('The book ' || auxItemID || ' is now avaible.'); 766 | ELSIF auxVideo > 0 THEN 767 | UPDATE video 768 | SET avalability = 'A' 769 | WHERE videoid LIKE auxItemID; 770 | DBMS_OUTPUT.PUT_LINE('The video ' || auxItemID || ' is now avaible.'); 771 | END IF; 772 | ELSE 773 | DBMS_OUTPUT.PUT_LINE('This item is not rented at the moment'); 774 | END IF; 775 | EXCEPTION WHEN no_data_found THEN 776 | DBMS_OUTPUT.PUT_LINE('Item ID incorrect'); 777 | END; 778 | 779 | SET SERVEROUTPUT ON; 780 | DECLARE 781 | auxItemID VARCHAR2(10); 782 | BEGIN 783 | auxItemID := &ItemID_to_return; 784 | handleReturns_library(auxItemID); 785 | END; 786 | 787 | SELECT * FROM rent; 788 | SELECT * FROM book; 789 | 790 | 791 | --11-- 792 | CREATE OR REPLACE TRIGGER modifyFines_library 793 | AFTER DELETE 794 | ON rent 795 | FOR EACH ROW 796 | DECLARE 797 | auxCardID NUMBER; 798 | auxItemID VARCHAR2(6); 799 | auxBook NUMBER; 800 | auxVideo NUMBER; 801 | auxDeby NUMBER; 802 | BEGIN 803 | SELECT cardid, itemid INTO auxCardID, auxItemID 804 | FROM rent 805 | WHERE cardid LIKE :old.cardid; 806 | 807 | SELECT COUNT(*) INTO auxBook 808 | FROM book 809 | WHERE bookid LIKE auxItemID; 810 | 811 | SELECT COUNT(*) INTO auxVideo 812 | FROM video 813 | WHERE videoid LIKE auxItemID; 814 | 815 | IF sysdate > :old.returndate THEN 816 | IF auxVideo > 0 THEN 817 | SELECT debyCost INTO auxDeby 818 | FROM video 819 | WHERE videoid LIKE auxItemID; 820 | ELSIF auxBook > 0 THEN 821 | SELECT debyCost INTO auxDeby 822 | FROM book 823 | WHERE bookid LIKE auxItemID; 824 | END IF; 825 | 826 | UPDATE card 827 | SET status = 'B', fines = (fines + auxDeby) 828 | WHERE cardid LIKE auxCardID; 829 | ELSE 830 | DBMS_OUTPUT.PUT_LINE('The item has been return before deadline'); 831 | END IF; 832 | END; 833 | --EXAMPLE-- 834 | INSERT INTO customer 835 | VALUES (12,'ALEJANDRO','ZAIDIN',629629629,'alex123','al12',sysdate,112); 836 | 837 | SELECT * FROM rent; 838 | 839 | SET SERVEROUTPUT ON; 840 | DECLARE 841 | auxCard NUMBER; 842 | auxItemID VARCHAR2(10); 843 | itemType VARCHAR2(20); 844 | auxDate DATE; 845 | BEGIN 846 | auxCard := &Card_ID; 847 | itemType := &Item_Type_book_or_video; 848 | auxItemID := &ID_Item; 849 | auxDate := &Return_date; 850 | rentItem_library(auxCard,auxItemID,itemType,auxDate); 851 | END; 852 | 853 | SELECT * FROM rent; 854 | 855 | SET SERVEROUTPUT ON; 856 | DECLARE 857 | auxItemID VARCHAR2(10); 858 | BEGIN 859 | auxItemID := &ItemID_to_return; 860 | handleReturns_library(auxItemID); 861 | END; 862 | 863 | DELETE FROM card WHERE cardid LIKE 112; 864 | SELECT * FROM card; 865 | 866 | 867 | 868 | --12-- 869 | --BOOK-- 870 | CREATE OR REPLACE PROCEDURE addBook_library(auxISBN IN VARCHAR2, auxBookID IN VARCHAR2, auxState IN VARCHAR2, auxDebyCost IN NUMBER, 871 | auxLostCost IN NUMBER, auxAddress IN VARCHAR2) 872 | IS 873 | BEGIN 874 | INSERT INTO book 875 | VALUES(auxISBN,auxBookID,auxState,'A',auxDebyCost,auxLostCost,auxAddress); 876 | DBMS_OUTPUT.PUT_LINE('Book inserted correctly'); 877 | END; 878 | 879 | --VIDEO-- 880 | CREATE OR REPLACE PROCEDURE addVideo_library(auxTitle IN VARCHAR2, auxYear IN INT, auxVideoID IN VARCHAR2, auxState IN VARCHAR2, auxDebyCost IN NUMBER, 881 | auxLostCost IN NUMBER, auxAddress IN VARCHAR2) 882 | IS 883 | BEGIN 884 | INSERT INTO video 885 | VALUES(auxTitle,auxYear,auxVideoID,auxState,'A',auxDebyCost,auxLostCost,auxAddress); 886 | DBMS_OUTPUT.PUT_LINE('Video inserted correctly'); 887 | END; 888 | 889 | --EXAMPLES-- 890 | SET SERVEROUTPUT ON; 891 | DECLARE 892 | auxISBN VARCHAR2(4); 893 | auxItemID VARCHAR2(6); 894 | auxState VARCHAR2(10); 895 | auxDebyCost NUMBER(10,2); 896 | auxLostCost NUMBER(10,2); 897 | auxAddress VARCHAR2(50); 898 | BEGIN 899 | auxISBN := &ISBN; 900 | auxItemID := &ItemID; 901 | auxState := &State; 902 | auxDebyCost := &Deby_Cost; 903 | auxLostCost := &Lost_Cost; 904 | auxAddress := &Location; 905 | addBook_library(auxISBN, auxItemID, auxState, auxDebyCost, auxLostCost, auxAddress); 906 | END; 907 | 908 | SELECT * FROM book; 909 | 910 | SET SERVEROUTPUT ON; 911 | DECLARE 912 | auxTitle VARCHAR2(50); 913 | auxYear INT; 914 | auxItemID VARCHAR2(6); 915 | auxState VARCHAR2(10); 916 | auxDebyCost NUMBER(10,2); 917 | auxLostCost NUMBER(10,2); 918 | auxAddress VARCHAR2(50); 919 | BEGIN 920 | auxTitle := &Title; 921 | auxYear := &Year; 922 | auxItemID := &ItemID; 923 | auxState := &State; 924 | auxDebyCost := &Deby_Cost; 925 | auxLostCost := &Lost_Cost; 926 | auxAddress := &Location; 927 | addVideo_library(auxTitle, auxYear, auxItemID, auxState, auxDebyCost, auxLostCost, auxAddress); 928 | END; 929 | 930 | SELECT * FROM video; 931 | 932 | 933 | 934 | --13-- 935 | CREATE OR REPLACE PROCEDURE removeItem_library(auxItemID IN VARCHAR2) 936 | IS 937 | auxBook NUMBER; 938 | auxVideo NUMBER; 939 | BEGIN 940 | SELECT COUNT(*) INTO auxBook 941 | FROM book 942 | WHERE bookid LIKE auxItemID; 943 | 944 | SELECT COUNT(*) INTO auxVideo 945 | FROM video 946 | WHERE videoid LIKE auxItemID; 947 | 948 | IF auxBook > 0 THEN 949 | DELETE FROM book 950 | WHERE bookid LIKE auxItemID; 951 | DBMS_OUTPUT.PUT_LINE('Book removed correctly'); 952 | ELSIF auxVideo > 0 THEN 953 | DELETE FROM video 954 | WHERE videoid LIKE auxItemID; 955 | DBMS_OUTPUT.PUT_LINE('Video removed correctly'); 956 | END IF; 957 | END; 958 | 959 | SET SERVEROUTPUT ON; 960 | DECLARE 961 | auxItemID VARCHAR2(10); 962 | BEGIN 963 | auxItemID := &ItemID_to_remove; 964 | removeItem_library(auxItemID); 965 | END; 966 | 967 | 968 | 969 | --14-- 970 | --The statement indicates the creation of another function, but we have made function five meet both needs-- 971 | 972 | 973 | --14-- 974 | CREATE OR REPLACE PROCEDURE viewCustomer_library(auxCustomerID IN NUMBER) 975 | IS 976 | custoName VARCHAR2(40); 977 | custoAdd VARCHAR2(50); 978 | custoPhone NUMBER(9); 979 | userNaM VARCHAR2(10); 980 | custoDate DATE; 981 | custoCard NUMBER; 982 | BEGIN 983 | SELECT name,customeraddress,phone,username,datesignup,cardnumber 984 | INTO custoName, custoAdd, custoPhone, userNaM, custoDate, custoCard 985 | FROM customer 986 | WHERE customerid LIKE auxCustomerID; 987 | 988 | DBMS_OUTPUT.PUT_LINE('CUSTOMER ' || auxCustomerID || ' INFO'); 989 | DBMS_OUTPUT.PUT_LINE('------------------------------------------'); 990 | DBMS_OUTPUT.PUT_LINE('NAME: ' || custoName); 991 | DBMS_OUTPUT.PUT_LINE('ADDRESS: ' || custoAdd); 992 | DBMS_OUTPUT.PUT_LINE('PHONE: ' || custoPhone); 993 | DBMS_OUTPUT.PUT_LINE('USER NAME: ' || userNaM); 994 | DBMS_OUTPUT.PUT_LINE('DATE OF SIGN UP: ' || custoDate); 995 | DBMS_OUTPUT.PUT_LINE('CARD NUMBER: ' || custoCard); 996 | DBMS_OUTPUT.PUT_LINE('------------------------------------------'); 997 | 998 | END; 999 | 1000 | SET SERVEROUTPUT ON; 1001 | DECLARE 1002 | auxCustoID VARCHAR2(10); 1003 | BEGIN 1004 | auxCustoID := &CustomerID; 1005 | viewCustomer_library(auxCustoID); 1006 | END; 1007 | 1008 | 1009 | 1010 | --OBJECT-- 1011 | CREATE OR REPLACE TYPE director_library AS OBJECT( 1012 | employeeid NUMBER, 1013 | name VARCHAR2(40), 1014 | address VARCHAR2(50), 1015 | phone INT(9), 1016 | paycheck NUMBER(10,2), 1017 | extrapaycheck NUMBER(10,2) 1018 | ); 1019 | 1020 | SET SERVEROUTPUT ON; 1021 | DECLARE 1022 | director director_library; 1023 | BEGIN 1024 | director := director_library('212', 'CHANDLER', 'OUR HEARTHS', 688688688,1150.5,500); 1025 | dbms_output.put_line('DIRECTOR ID: '|| director.employeeid); 1026 | dbms_output.put_line('--------------------------------------------' ); 1027 | dbms_output.put_line('NAME: '|| director.name); 1028 | dbms_output.put_line('ADDRESS: '|| director.address); 1029 | dbms_output.put_line('PHONE: '|| director.phone); 1030 | dbms_output.put_line('PAYCHECK: '|| director.paycheck); 1031 | dbms_output.put_line('EXTRA: '|| director.extrapaycheck); 1032 | dbms_output.put_line('--------------------------------------------' ); 1033 | END; 1034 | -------------------------------------------------------------------------------- /Library.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PL-SQL-project 2 | PL / SQL Project based on a library's database. 3 | 4 | 5 | 6 |

Normalization

7 | --------------------------------------------------------------------------------