Skip to content

Instantly share code, notes, and snippets.

@peterlafferty
Created May 4, 2017 21:56
Show Gist options
  • Save peterlafferty/0e8ef20be8d8e99697ed0bf59f4f38ee to your computer and use it in GitHub Desktop.
Save peterlafferty/0e8ef20be8d8e99697ed0bf59f4f38ee to your computer and use it in GitHub Desktop.
schema to demonstrate advanced stored procedures with MySQL
CREATE DATABASE IF NOT EXISTS `hotel` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `hotel`;
-- MySQL dump 10.13 Distrib 5.7.17, for macos10.12 (x86_64)
--
-- Host: localhost Database: hotel
-- ------------------------------------------------------
-- Server version 5.7.18
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `Availability`
--
DROP TABLE IF EXISTS `Availability`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Availability` (
`idAvailability` int(11) NOT NULL AUTO_INCREMENT,
`idRoom` int(11) NOT NULL,
`numberAvailable` int(11) NOT NULL,
`price` decimal(10,2) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`idAvailability`),
UNIQUE KEY `UNIQUE` (`idRoom`,`date`),
CONSTRAINT `fk_Availability_Room` FOREIGN KEY (`idRoom`) REFERENCES `Room` (`idRoom`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `Availability`
--
LOCK TABLES `Availability` WRITE;
/*!40000 ALTER TABLE `Availability` DISABLE KEYS */;
INSERT INTO `Availability` (`idAvailability`, `idRoom`, `numberAvailable`, `price`, `date`) VALUES (1,1,10,10.00,'2017-12-10'),(2,2,17,5.00,'2017-12-10');
/*!40000 ALTER TABLE `Availability` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `Hotel`
--
DROP TABLE IF EXISTS `Hotel`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Hotel` (
`idHotel` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`idHotel`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `Hotel`
--
LOCK TABLES `Hotel` WRITE;
/*!40000 ALTER TABLE `Hotel` DISABLE KEYS */;
INSERT INTO `Hotel` (`idHotel`, `name`) VALUES (1,'Peter\'s Pad');
/*!40000 ALTER TABLE `Hotel` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `Room`
--
DROP TABLE IF EXISTS `Room`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Room` (
`idRoom` int(11) NOT NULL AUTO_INCREMENT,
`idHotel` int(11) NOT NULL,
`beds` tinyint(4) NOT NULL,
`capacity` tinyint(4) NOT NULL,
`price` decimal(10,2) NOT NULL,
`maxAvailable` int(11) NOT NULL,
PRIMARY KEY (`idRoom`),
KEY `fk_Room_Hotel_idx` (`idHotel`),
CONSTRAINT `fk_Room_Hotel` FOREIGN KEY (`idHotel`) REFERENCES `Hotel` (`idHotel`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `Room`
--
LOCK TABLES `Room` WRITE;
/*!40000 ALTER TABLE `Room` DISABLE KEYS */;
INSERT INTO `Room` (`idRoom`, `idHotel`, `beds`, `capacity`, `price`, `maxAvailable`) VALUES (1,1,1,2,10.00,10),(2,1,1,1,5.00,17);
/*!40000 ALTER TABLE `Room` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Dumping routines for database 'hotel'
--
/*!50003 DROP PROCEDURE IF EXISTS `addAvailability` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE PROCEDURE `addAvailability`(
IN p_idHotel INT,
IN p_date DATE
)
BEGIN
#variables
DECLARE v_done INT DEFAULT FALSE;
DECLARE v_idRoom INT;
DECLARE v_maxAvailable INT;
DECLARE v_price DECIMAL(10, 2);
#cursors
DECLARE cursorForRoom CURSOR FOR
SELECT
idRoom,
maxAvailable,
price
FROM
Room
WHERE
idHotel = p_idHotel;
#handlers
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
RESIGNAL;
END;
IF NOT EXISTS(SELECT * FROM Room WHERE idHotel = p_idHotel) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No Rooms';
END IF;
OPEN cursorForRoom;
START TRANSACTION;
read_loop: LOOP
FETCH cursorForRoom INTO v_idRoom, v_maxAvailable, v_price;
IF v_done THEN
LEAVE read_loop;
END IF;
INSERT INTO
Availability
SET
idAvailability = NULL,
idRoom = v_idRoom,
numberAvailable = v_maxAvailable,
price = v_price,
date = p_date;
END LOOP;
COMMIT;
CLOSE cursorForRoom;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2017-05-04 22:55:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment