Sajmon

DAIS_riesenia

Mar 26th, 2012
415
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 10.98 KB | None | 0 0
  1. /*
  2. napiste proceduru ktera nastavi cenu u vsech zaznamu v tabulce Train o 1,5 nasobek
  3. vyssi pokud doba jizdy je vyssy nez 10 hodin osetrete pripad kdy neexistuje takovy zaznam v tabulce. - OK
  4. */
  5.  
  6. CREATE PROCEDURE SetPrice
  7. AS
  8. BEGIN
  9. DECLARE kurzor CURSOR FOR (SELECT idTrain, price, startTime, endTime FROM Train);
  10. DECLARE
  11.     @v_time TIME, @v_idTrain INT, @v_price REAL, @v_startTime TIME, @v_endTime TIME;
  12. OPEN kurzor;
  13.     FETCH NEXT FROM kurzor INTO @v_idTrain, @v_price, @v_startTime, @v_endTime;
  14.     WHILE @@FETCH_STATUS = 0
  15.         BEGIN
  16.             IF (DATEDIFF(HH, CAST(@v_startTime AS DATETIME), CAST(@v_endTime AS DATETIME)) > 5)
  17.                 UPDATE Train SET price = price * 1.5 WHERE idTrain = @v_idTrain;
  18.         FETCH NEXT FROM kurzor INTO @v_idTrain, @v_price, @v_startTime, @v_endTime;    
  19.         END
  20. CLOSE kurzor;
  21. DEALLOCATE kurzor;
  22. END
  23.  
  24. EXECUTE SetPrice;
  25.  
  26. /*
  27. napis funkci s parametrem idtrainride, která vrací boolean true, jestlize je ve volaném vlaku jak
  28. strojvedouci, pruvodci, tak stejny pocet stevardu, jako je vagonů
  29. */
  30.  
  31. ALTER FUNCTION CheckStaff(@p_idTrainRide INT)
  32. RETURNS BIT
  33. AS
  34. BEGIN
  35. DECLARE kurzor CURSOR FOR (SELECT S.position FROM TrainRide AS T JOIN TrainCrew AS Tr ON (T.idTrainRide = Tr.idTrainRide)
  36.           JOIN Staff AS S ON (Tr.idStaff = S.idStaff) WHERE T.idTrainRide = @p_idTrainRide);
  37. DECLARE @v_pos VARCHAR(1), @v_strojveduci BIT, @v_sprievodci BIT, @v_steward BIT, @v_count INT;
  38.     SET @v_strojveduci = 0;
  39.     SET @v_sprievodci = 0;
  40.     SET @v_steward = 0;
  41.     SET @v_count = 0;
  42. OPEN kurzor;
  43.     FETCH NEXT FROM kurzor INTO @v_pos;
  44.     WHILE @@FETCH_STATUS = 0
  45.         BEGIN
  46.             IF (@v_pos = 'd')
  47.                 SET @v_strojveduci = 1;
  48.             ELSE IF (@v_pos = 'g')
  49.                 SET @v_sprievodci = 1;
  50.             ELSE
  51.                 BEGIN
  52.                     SET @v_steward = 1;
  53.                     SET @v_count = @v_count + 1;
  54.                 END
  55.         FETCH NEXT FROM kurzor INTO @v_pos;            
  56.         END
  57. CLOSE kurzor;
  58. DEALLOCATE kurzor;
  59. IF (@v_strojveduci = 1 AND @v_sprievodci = 1 AND @v_steward = 1
  60.             AND @v_count = (SELECT T.coachCount FROM Train AS T JOIN TrainRide AS Tr ON (T.idTrain = Tr.idTrain) WHERE Tr.idTrainRide = @p_idTrainRide))
  61.             RETURN 1;
  62.         RETURN 0;      
  63. END
  64.  
  65. BEGIN
  66.     IF (dor0023.CheckStaff('1') = 1)
  67.         PRINT 'EXISTS';
  68.     ELSE
  69.         PRINT 'NON EXISTS';
  70. END
  71.  
  72. /*
  73. proceduru zmenCenu (jmenoStanice1, jmenoStanice2, percentage)
  74. ktorá mala zvýšiť alebo znížiť cenu jízdneho o zadané percento(percentage)
  75. pre danú vlakovú trasu a malo vypísať počet zmenených záznamov.
  76. */
  77.  
  78. ALTER PROCEDURE ChangePrice(@p_idStation INT, @p_idStation1 INT, @p_percentage INT)
  79. AS
  80. BEGIN
  81. DECLARE kurzor CURSOR FOR (SELECT idTrain, price FROM Train WHERE idStation = @p_idStation AND idStation1 = @p_idStation1);
  82. DECLARE
  83.     @v_price REAL, @v_idTrain INT, @v_count INT;
  84.     SET @v_count = 0;
  85. BEGIN TRY  
  86.     OPEN kurzor;
  87.         FETCH NEXT FROM kurzor INTO @v_idTrain, @v_price;
  88.         WHILE @@FETCH_STATUS = 0
  89.             BEGIN
  90.                 UPDATE Train SET price = ROUND((price + ((@v_price * @p_percentage) / 100)),1) WHERE idTrain = @v_idTrain; 
  91.                 SET @v_count = @v_count + 1;
  92.             FETCH NEXT FROM kurzor INTO @v_idTrain, @v_price;  
  93.             END
  94.             PRINT 'Pocet zmenenych zaznamov: ' + CAST(@v_count AS VARCHAR);
  95.     CLOSE kurzor;
  96.     DEALLOCATE kurzor;
  97. END TRY
  98. BEGIN CATCH
  99.     PRINT 'Zaznam neexistuje';
  100.     CLOSE kurzor;
  101.     DEALLOCATE kurzor;
  102. END CATCH  
  103. END
  104.  
  105. EXECUTE ChangePrice '1','2','40';
  106.  
  107.  
  108. /*
  109. UDBS Trigger, mělo se při INSERT INTO Staff automaticky dát jobStart a průměrné salary
  110. pro všechny se stejným povoláním (d, g, s)
  111. */
  112. CREATE TRIGGER BeforeStaff
  113. ON Staff
  114. AFTER INSERT
  115. AS
  116. DECLARE
  117.     @v_avg REAL, @v_pos VARCHAR(1), @v_jobStart DATETIME;
  118.     SET @v_pos = (SELECT position FROM INSERTED);
  119.     SET @v_jobStart = (SELECT jobStart FROM INSERTED);
  120.     SET @v_avg = (SELECT AVG(salary) FROM Staff WHERE position = @v_pos);
  121. BEGIN
  122.     UPDATE Staff SET jobStart = @v_jobStart, salary = @v_avg WHERE position = @v_pos;
  123.     PRINT 'Statement(s) was updated.';
  124. END
  125.  
  126. /*
  127. 1. vytvorte proceduru customerstats s paramentrem email typu varchar ktora na dbms output
  128. vypise statistiku vyuziti jednotlivych spojov zakaznikom urcenym emailom. vzor vystupu :
  129.  
  130. customer “[email protected]” has used
  131. train no. 231 : 3 TIMES
  132. train no. 256 : 2 TIMES
  133. */
  134. ALTER PROCEDURE CustomerStats(@p_email VARCHAR(50))
  135. AS
  136. BEGIN
  137. DECLARE kurzor CURSOR FOR (SELECT Tr.idTrain, Tr.name, COUNT(*) AS Pocet FROM [User] AS U
  138.                           JOIN Reservation AS R ON (U.idUser = R.idUser)
  139.                           JOIN TrainRide AS T ON (R.idTrainRide = T.idTrainRide)
  140.                           JOIN Train AS Tr ON (T.idTrain = Tr.idTrain)
  141.                           WHERE (U.email = @p_email) GROUP BY Tr.idTrain, Tr.name);
  142. DECLARE @v_idTrain INT, @v_name VARCHAR(10), @v_count INT;
  143. OPEN kurzor;
  144.     FETCH NEXT FROM kurzor INTO @v_idTrain, @v_name, @v_count;
  145.     PRINT 'User ' + @p_email + ' has used: ';
  146.     WHILE @@FETCH_STATUS = 0
  147.         BEGIN
  148.             PRINT 'Train ' + @v_name + ' (ID: ' + CAST(@v_idTrain AS VARCHAR) + ') ' + CAST(@v_count AS VARCHAR) + ' times.';
  149.         FETCH NEXT FROM kurzor INTO @v_idTrain, @v_name, @v_count; 
  150.         END
  151. CLOSE kurzor;
  152. DEALLOCATE kurzor;
  153. END
  154.                          
  155. EXECUTE CustomerStats '[email protected]';
  156.  
  157. /*
  158. trigger ktory v pripade ze sa niekto pokusi zarezervovat si miesto v
  159. neexistujucom vagone(v rezervaci uvede vagon s vyssim cislom ako pocet vagonov),
  160. vypise na dbms output chybouvou hlasku a vyhodi uzivatelsku vynimku.
  161. Pote napiste ulozenu proceduru Reserve s parametry idTrainRide, coachnumber ,
  162. seatnumber a id Customer ktora vlozi do tabulky reservation exception.
  163. */
  164. CREATE TRIGGER CheckReservation
  165. ON Reservation
  166. FOR INSERT
  167. AS
  168. BEGIN
  169. DECLARE @v_coachNumber INT, @v_idTrainRide INT, @v_coachCount INT;
  170.     SET @v_coachNumber = (SELECT coachNumber FROM INSERTED);
  171.     SET @v_idTrainRide = (SELECT idTrainRide FROM INSERTED);
  172. IF (@v_coachNumber > (SELECT DISTINCT Tr.coachCount FROM Reservation AS R
  173.                       JOIN TrainRide AS T ON (R.idTrainRide = T.idTrainRide)
  174.                       JOIN Train AS Tr ON (T.idTrain = Tr.idTrain) WHERE R.idTrainRide = @v_idTrainRide))
  175.     PRINT 'Vagon neexistuje.';
  176. ELSE
  177.     PRINT 'Vagon existuje.';
  178. END
  179.  
  180. /*
  181. Přidejte do tabulky Reservation atribut confirm, který bude cizím klíčem na tabulku Staff a který může být NULL.
  182. Nastavení atributu znamená, že rezervace uživatele byla potvrzena daným člověkem z tabulky Staff.
  183. Napište uloženou funkci CheckStaff(p idUser Integer, p idTrainRide Integer), která bude vracet true,
  184. pokud všechny rezervace pro p idTrainRide uživatele p idUser byly potvrzeny nějakým člověkem, který je v posádce vlaku.
  185. V opačném případě vraťte false.
  186. */
  187.  
  188. ALTER TABLE Reservation ADD confirm INT NULL;
  189.  
  190. ALTER TABLE Reservation
  191. ADD CONSTRAINT fk_staff
  192. FOREIGN KEY (confirm)
  193. REFERENCES Staff(idStaff);
  194.  
  195. CREATE FUNCTION CheckStaffFunction(@p_idUser INT, @p_idTrainRide INT)
  196. RETURNS BIT
  197. AS
  198. BEGIN
  199. DECLARE kurzor CURSOR FOR (SELECT confirm FROM Reservation WHERE idUser = @p_idUser AND idTrainRide = @p_idTrainRide);
  200. DECLARE
  201.     @v_result BIT, @v_confirm INT;
  202. OPEN kurzor;
  203.     FETCH NEXT FROM kurzor INTO @v_confirm
  204.     WHILE @@FETCH_STATUS = 0
  205.         BEGIN
  206.             IF (@v_confirm IS NULL)
  207.                 SET @v_result = 0;
  208.             ELSE
  209.                 SET @v_result = 1;
  210.         FETCH NEXT FROM kurzor INTO @v_confirm;    
  211.         END
  212. CLOSE kurzor;
  213. DEALLOCATE kurzor; 
  214. IF (@v_result = 1)
  215.     RETURN 1;
  216. RETURN 0;  
  217. END
  218.  
  219. BEGIN
  220.     IF (dor0023.CheckStaffFunction('1','1') = 1)
  221.         PRINT 'TRUE';
  222.     ELSE
  223.         PRINT 'FALSE'
  224. END
  225.  
  226.  
  227. CREATE PROCEDURE PocetJizd
  228. AS
  229. BEGIN
  230. DECLARE kurzor CURSOR FOR SELECT S.idStaff, S.fname, S.lname, COUNT(S.idStaff) AS Pocet FROM Staff AS S
  231.                            JOIN TrainCrew AS Tr ON (S.idStaff = Tr.idStaff) GROUP BY S.idStaff, S.fname, S.lname ORDER BY Pocet DESC;
  232. DECLARE
  233.     @v_idStaff INT, @v_fname VARCHAR(30), @v_lname VARCHAR(50), @v_count INT, @v_max INT, @v_topWorkerId INT;
  234.     SET @v_max = 0;
  235. OPEN kurzor;
  236.     FETCH NEXT FROM kurzor INTO @v_idStaff, @v_fname, @v_lname, @v_count;
  237.     WHILE @@FETCH_STATUS = 0
  238.         BEGIN
  239.             IF (@v_count > @v_max)
  240.                 BEGIN
  241.                     SET @v_max = @v_count;
  242.                     SET @v_topWorkerId = @v_idStaff;
  243.                 END
  244.             PRINT @v_fname + ' ' + @v_lname + ' ' + CAST(@v_count AS VARCHAR);
  245.         FETCH NEXT FROM kurzor INTO @v_idStaff, @v_fname, @v_lname, @v_count;    
  246.         END
  247. CLOSE kurzor;
  248. DEALLOCATE kurzor;
  249. DECLARE tKurzor CURSOR FOR SELECT T.idTrain FROM Staff AS S JOIN TrainCrew AS Tr ON (S.idStaff = Tr.idStaff)
  250.                            JOIN TrainRide AS T ON (Tr.idTrainRide = T.idTrainRide) WHERE Tr.idStaff = @v_topWorkerId;
  251. DECLARE
  252.     @v_idTrain INT, @v_name VARCHAR(30);
  253.     SET @v_name = (SELECT fname FROM Staff WHERE idStaff = @v_topWorkerId);                        
  254. OPEN tKurzor;
  255.     FETCH NEXT FROM tKurzor INTO @v_idTrain;
  256.     PRINT 'TOP EMPLOYER: ' + @v_name;
  257.     PRINT 'RIDES:';
  258.     WHILE @@FETCH_STATUS = 0
  259.         BEGIN
  260.             PRINT 'TRAIN WITH ID: ' + CAST(@v_idTrain AS VARCHAR);
  261.         FETCH NEXT FROM tKurzor INTO @v_idTrain;   
  262.         END
  263. CLOSE tKurzor;
  264. DEALLOCATE tKurzor;                        
  265. END
  266.  
  267. EXECUTE PocetJizd;
  268.  
  269.  
  270. /*
  271. Vložte trigger nad tabulkou TrainCrew, Trigger bude při pokusu vložit nebo upravit záznam
  272. v této tabulce kontrolovat, jestli může být takovýto záznam vytvořen,
  273. aby nebyly porušeny podmínky ze zadaání: Každý vlak má svogji posádku přičemž
  274. posádku může tvořit jeden strojvůdce (Staff.position=’d’), jeden průvodčí (Staff.position=’g’) a
  275. na každý vagon připadaá jeden palubní stevard (Staff.position=’s’).
  276. Takže, například aby jeden vlak neměl 2 strojvůdce. Pokud se záznam do tabulky povede vytvořit,
  277. trigger vypíše an obrazovku OK, pokud ne, trigger vypíše záznam nelze vložit, protože tento vlak již
  278.  obsahuje posádku na pozici …(pozice vlkádaného záznamu).
  279. */
  280. ALTER TRIGGER CheckStaffForTrain
  281. ON TrainCrew
  282. FOR INSERT
  283. AS
  284. BEGIN
  285. DECLARE
  286.     @v_idTrainRideFromInserted INT, @v_idStaffFromInserted INT, @v_positionFromInserted VARCHAR(1), @v_coachCount INT, @v_countOfStewards INT;
  287.     SET @v_idTrainRideFromInserted = (SELECT idTrainRide FROM INSERTED);
  288.     SET @v_idStaffFromInserted = (SELECT idStaff FROM INSERTED);
  289.     SET @v_countOfStewards = 0;
  290.     SET @v_positionFromInserted = (SELECT position FROM Staff WHERE idStaff = @v_idStaffFromInserted);
  291.     SET @v_coachCount = (SELECT DISTINCT coachCount FROM TrainCrew AS Tr
  292.                          JOIN TrainRide AS T ON (Tr.idTrainRide = T.idTrainRide)
  293.                          JOIN Train AS Tra ON (T.idTrain = Tra.idTrain) WHERE Tr.idTrainRide = @v_idTrainRideFromInserted);
  294.    
  295. DECLARE kurzor CURSOR FOR SELECT S.position FROM Staff AS S
  296.                           JOIN TrainCrew AS Tr ON (S.idStaff = Tr.idStaff) WHERE idTrainRide = @v_idTrainRideFromInserted;
  297. DECLARE
  298.     @v_position VARCHAR(1);                  
  299. OPEN kurzor;
  300.     FETCH NEXT FROM kurzor INTO @v_position;
  301.     WHILE @@FETCH_STATUS = 0
  302.         BEGIN
  303.             IF (@v_position = @v_positionFromInserted AND @v_position = 'd')
  304.                 PRINT 'Vlak uz ma svojho strojvodca!';
  305.             ELSE IF (@v_position = @v_positionFromInserted AND @v_position = 'g')
  306.                 PRINT 'Vlak uz ma svojho sprievodciho!';
  307.             ELSE IF (@v_position = @v_positionFromInserted AND @v_position = 's')
  308.                 SET @v_countOfStewards = @v_countOfStewards + 1;   
  309.         FETCH NEXT FROM kurzor INTO @v_position;           
  310.         END
  311.         IF (@v_countOfStewards > @v_coachCount)
  312.             PRINT 'Vlak uz ma potrebny pocet stewardov!';
  313. CLOSE kurzor;
  314. DEALLOCATE kurzor;
  315. END
  316.                      
  317. INSERT INTO TrainCrew VALUES('9','2');
Advertisement
Add Comment
Please, Sign In to add comment