Advertisement
Guest User

Untitled

a guest
May 18th, 2018
661
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.06 KB | None | 0 0
  1. DROP DATABASE IF EXISTS cableCompany;
  2. CREATE DATABASE cableCompany;
  3. USE cableCompany;
  4.  
  5. CREATE TABLE customers
  6. (
  7. customerID INT UNSIGNED NOT NULL AUTO_INCREMENT primary key,
  8. firstName VARCHAR(55) NOT NULL,
  9. middleName VARCHAR(55) NOT NULL,
  10. lastName VARCHAR(55) NOT NULL,
  11. email VARCHAR(55) NULL,
  12. phone VARCHAR(20) NOT NULL,
  13. address VARCHAR(255) NOT NULL
  14. );
  15.  
  16. CREATE TABLE accounts
  17. (
  18. accountID INT AUTO_INCREMENT PRIMARY KEY,
  19. amount DOUBLE NOT NULL,
  20. customer_id INT UNSIGNED NOT NULL,
  21. CONSTRAINT FOREIGN KEY (customer_id) REFERENCES customers(customerID)
  22. ON DELETE RESTRICT ON UPDATE CASCADE
  23. );
  24.  
  25. CREATE TABLE plans
  26. (
  27. planID INT AUTO_INCREMENT PRIMARY KEY,
  28. name VARCHAR(32) NOT NULL,
  29. monthly_fee DOUBLE NOT NULL
  30. );
  31.  
  32. CREATE TABLE payments
  33. (
  34. paymentID INT AUTO_INCREMENT PRIMARY KEY,
  35. paymentAmount DOUBLE NOT NULL,
  36. month TINYINT NOT NULL,
  37. year YEAR NOT NULL,
  38. dateOfPayment DATETIME NOT NULL,
  39. customer_id INT UNSIGNED NOT NULL,
  40. plan_id INT UNSIGNED NOT NULL,
  41. CONSTRAINT FOREIGN KEY (customer_id) REFERENCES customers(customerID),
  42. CONSTRAINT FOREIGN KEY (plan_id) REFERENCES plans (planID),
  43. UNIQUE KEY (customer_id, plan_id, month, year)
  44. );
  45.  
  46. CREATE TABLE debtors
  47. (
  48. customer_id INT NOT NULL,
  49. plan_id INT NOT NULL,
  50. debt_amount DOUBLE NOT NULL,
  51. FOREIGN KEY (customer_id) REFERENCES customers(customerID) ,
  52. FOREIGN KEY (plan_id) REFERENCES plans(planID) ,
  53. PRIMARY KEY (customer_id, plan_id)
  54. );
  55.  
  56. INSERT INTO customers (firstName, middleName, lastName, email, phone, address)
  57. VALUES
  58. ( 'Ivan', 'Todorov', 'Petrov', 'Ivan33@gmail.com', '0884123456', 'Sofia- Mladost'),
  59. ( 'Ivanka', 'Toshkova', 'Petkova', 'sunshine35@gmail.com', '0888257826', 'Plovdiv- Mladost'),
  60. ( 'Joro', 'Mitkov', 'Kuchkov', 'Joro12@abv.bg', '0882143552', 'Sliven- Drujba'),
  61. ( 'Filip', 'Ivanov', 'Georgiev', 'Filqka11@mail.bg', '0889134457', 'Varna- Moreto'),
  62. ( 'Hristo', 'Veselinov', 'Mitev', 'Icaka1134@gmail.com', '0882798410', 'England- Swindon'),
  63. ( 'Kalina', 'Dimitrova', 'Rasheva', 'bug21@abv.bg', '0881133357', 'Pleven- Mladost');
  64.  
  65. INSERT INTO accounts(amount, customer_id)
  66. VALUES (3000, 1), (1200, 2), (200, 3), (700, 4), (10000, 5), (120, 6);
  67.  
  68. INSERT INTO plans(name, monthly_fee) VALUES ('Plan 1', 200),
  69. ('Plan 2', 350),
  70. ('Plan 3', 1200),
  71. ('Plan 4', 120);
  72.  
  73. INSERT INTO payments (paymentAmount, month, year, dateOfPayment, customer_id, plan_id) VALUES
  74. (300, 1, 2016, '2016-03-03 16:35:00', 1, 3),
  75. (100, 1, 2016, '2016-03-04 17:35:00', 2, 2),
  76. (300, 1, 2016, '2016-03-05 11:43:00', 3, 1),
  77. (50, 1, 2016, '2016-03-06 15:11:00', 4, 4),
  78. (112, 1, 2016, '2016-03-07 09:51:00', 5, 3),
  79. (75, 1, 2016, '2016-03-08 10:15:00', 6, 2);
  80.  
  81. INSERT INTO debtors (customer_id, plan_id, debt_amount)
  82. VALUES (2, 2, 300), (5, 3, 150), (1, 3, 65), (6, 2, 200);
  83.  
  84.  
  85.  
  86. DROP PROCEDURE IF EXISTS payMonthTax
  87.  
  88. delimiter |
  89.  
  90. CREATE PROCEDURE payMonthTax(IN customerId INT, IN tempSum DECIMAL, OUT success bit)
  91.  
  92. BEGIN
  93.  
  94. IF((SELECT amount
  95. FROM accounts
  96. WHERE amount >= tempSum
  97. AND customer_id = customerId
  98. ) IS NULL)
  99. THEN
  100. SELECT 'Invalid id or there is not enough money in the account!';
  101. SET success = 0;
  102. ELSE
  103. IF
  104. ((
  105. SELECT paymentAmount
  106. FROM payments
  107. WHERE customer_id = customerId
  108. ) = 0)
  109. THEN
  110. SELECT 'The fee is already paid';
  111. SET success = 1;
  112. ELSE
  113. SET success = 0;
  114.  
  115.  
  116. START TRANSACTION;
  117.  
  118. UPDATE accounts SET amount = amount - tempSum
  119. WHERE customer_id = customerId;
  120.  
  121. IF(ROW_COUNT() = 0)
  122. THEN
  123. ROLLBACK;
  124. ELSE
  125. UPDATE payments
  126. SET paymentAmount = paymentAmount - tempSum WHERE customer_id = customerId;
  127.  
  128. IF(ROW_COUNT() = 0)
  129. THEN
  130. ROLLBACK;
  131. ELSE
  132. SET success = 1;
  133. SELECT 'Transaction complete'
  134. COMMIT;
  135.  
  136. END IF;
  137. END IF;
  138. END IF;
  139. END IF;
  140. END;
  141. |
  142. delimiter ;
  143.  
  144.  
  145.  
  146. DROP PROCEDURE IF EXISTS paymentTime;
  147.  
  148. delimiter |
  149.  
  150. CREATE PROCEDURE paymentTime(IN monthOfPayment TINYINT, IN yearOfPayment INT)
  151.  
  152. BEGIN
  153. DECLARE tempSum DECIMAL;
  154. DECLARE tempCustomerId INT;
  155. DECLARE tempPlanId INT;
  156. DECLARE result INT;
  157. DECLARE paymentCursor CURSOR FOR
  158. SELECT customer_id, paymentAmount, plan_id
  159. FROM payments
  160. WHERE `month` = monthOfPayment
  161. AND `year` = yearOfPayment;
  162. DECLARE CONTINUE HANDLER FOR NOT FOUND SET result = 1;
  163.  
  164. DROP TABLE IF EXISTS tempAccount;
  165.  
  166. CREATE TEMPORARY TABLE tempAccount(
  167. tempId INT NOT NULL,
  168. tempAmount INT NOT NULL,
  169. CustomerID INT NOT NULL,
  170. debt INT NOT NULL,
  171. planId INT NOT NULL
  172. )ENGINE = MEMORY;
  173.  
  174. START TRANSACTION;
  175. OPEN paymentCursor;
  176. SET result = 0;
  177. payment_loop: WHILE (result = 0)
  178. DO FETCH paymentCursor INTO tempCustomerId, tempSum, tempPlanId;
  179.  
  180. IF(result = 1) THEN LEAVE payment_loop;
  181. ELSE
  182. SET @RESULT = 0;
  183. CALL payMonthTax(tempCustomerId, tempSum, @RESULT);
  184.  
  185. IF(@RESULT = 0)
  186. THEN
  187. SELECT tempCustomerId, tempSum;
  188. INSERT INTO tempAccount (tempId, tempAmount, CustomerID, debt, planId)
  189. SELECT a.accountID, a.amount, tempCustomerId, (tempSum - a.amount), tempPlanId
  190. FROM accounts as a
  191. WHERE a.customer_id = tempCustomerId;
  192. END IF;
  193. END IF;
  194. END WHILE;
  195. CLOSE paymentCursor;
  196. SELECT * FROM tempAccount; #only for test
  197.  
  198. INSERT INTO debtors(customer_id, plan_id, debt_amount)
  199. SELECT CustomerID, planId, debt
  200. FROM tempAccount
  201. ON DUPLICATE KEY UPDATE
  202. debt_amount = debt_amount + debt;
  203.  
  204.  
  205. UPDATE accounts
  206. SET amount = 0 WHERE customer_id IN (SELECT CustomerID
  207. FROM tempAccount);
  208.  
  209. IF(ROW_COUNT() = 0)
  210. THEN ROLLBACK;
  211. ELSE
  212.  
  213. UPDATE payments
  214. SET paymentAmount = 0 WHERE customer_id IN (SELECT CustomerID
  215. FROM tempAccount)
  216. AND `month` = monthOfPayment
  217. AND `year` = yearOfPayment;
  218.  
  219. IF(ROW_COUNT() = 0)
  220. THEN ROLLBACK;
  221. ELSE
  222. COMMIT;
  223. SELECT 'Transaction finished!';
  224.  
  225. END IF;
  226. END IF;
  227. DROP TABLE tempAccount;
  228. END
  229.  
  230. |
  231. delimiter ;
  232.  
  233. CALL paymentTime(1, 2016);
  234.  
  235.  
  236.  
  237. DROP EVENT IF EXISTS paymentEvent;
  238.  
  239. delimiter |
  240.  
  241. CREATE EVENT paymentEvent
  242.  
  243. ON SCHEDULE EVERY 1 MONTH
  244. STARTS '2018-05-28 17:00:00'
  245. DO
  246. BEGIN
  247. CALL paymentTime(MONTH(NOW()), YEAR(NOW()));
  248. END;
  249. |
  250. DELIMITER ;
  251.  
  252.  
  253. DROP VIEW IF EXISTS testView;
  254.  
  255. CREATE VIEW testView
  256. AS SELECT customers.firstName, customers.middleName, customers.lastName, payments.year, payments.month,
  257. plans.name, plans.monthly_fee
  258. FROM customers JOIN payments JOIN plans
  259. ON customers.customerId = payments.customer_id
  260. AND plans.planId = payments.plan_id;
  261.  
  262. #SELECT * FROM testView;
  263.  
  264.  
  265.  
  266. DROP TRIGGER IF EXISTS planTrigger
  267.  
  268. DELIMITER |
  269.  
  270. CREATE TRIGGER planTrigger BEFORE INSERT ON plans
  271. FOR EACH ROW
  272. BEGIN
  273. IF(NEW.monthly_fee <= 10)
  274. THEN
  275. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The fee must be over 10 BGN!';
  276. END IF;
  277. END
  278. |
  279. delimiter ;
  280.  
  281. #for test
  282. #INSERT INTO plans(name, monthly_fee)
  283. #VALUES ('Plan 1', 9);
  284.  
  285. DROP PROCEDURE IF EXISTS printInfo;
  286.  
  287. DELIMITER |
  288.  
  289.  
  290. CREATE PROCEDURE printInfo(IN name1 VARCHAR(15), IN name2 VARCHAR(15), IN name3 VARCHAR(15))
  291.  
  292. BEGIN
  293. SELECT customers.*, payments.paymentAmount
  294. FROM customers JOIN payments
  295. ON customers.customerId = payments.customer_id
  296. WHERE firstName = name1 and middleName = name2 and lastName= name3;
  297. END
  298. |
  299. DELIMITER ;
  300.  
  301. #CALL printInfo('Ivan', 'Todorov', 'Petrov');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement