Sajmon

DAIS_C5

Mar 8th, 2012
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 9.31 KB | None | 0 0
  1. /**
  2.  @Author: Sajmon
  3.  @Date: 7.3.2012
  4.  @DAIS: T-SQL, 1C
  5. **/
  6.  
  7. -- 1.
  8. CREATE TABLE Student(
  9.     login CHAR(6) PRIMARY KEY NOT NULL,
  10.     fname VARCHAR(30) NOT NULL,
  11.     lname VARCHAR(50) NOT NULL,
  12.     email VARCHAR(50) NOT NULL);
  13.    
  14. CREATE PROCEDURE AddStudent (@p_login CHAR(6), @p_fname VARCHAR(30), @p_lname VARCHAR(50), @p_email VARCHAR(50))
  15. AS
  16. BEGIN
  17.     INSERT INTO Student VALUES(@p_login, @p_fname, @p_lname, @p_email);
  18. END
  19. GO
  20. EXECUTE AddStudent 'BED05','Pavel','Bednář','[email protected]';
  21.  
  22. -- 2
  23. CREATE PROCEDURE PaddStudent (@p_login CHAR(6), @p_fname VARCHAR(30), @p_lname VARCHAR(50), @p_email VARCHAR(50), @p_vystup VARCHAR(10) OUTPUT)
  24. AS
  25. BEGIN
  26.     BEGIN TRY
  27.         INSERT INTO Student VALUES(@p_login, @p_fname, @p_lname, @p_email);
  28.         SET @p_vystup = 'OK';
  29.     END TRY
  30.     BEGIN CATCH
  31.         SET @p_vystup = 'ERROR';
  32.     END CATCH
  33. END
  34.  
  35. GO
  36. DECLARE
  37.     @v_vystup VARCHAR(10);
  38. BEGIN
  39.     EXECUTE PAddStudent 'GAJ027','Martin','Gajdiciar','[email protected]',@v_vystup OUT;
  40.     PRINT @v_vystup;
  41. END
  42.  
  43. -- 3 + 4
  44. CREATE TABLE Teacher (
  45. login CHAR(6) NOT NULL PRIMARY KEY,
  46. fname VARCHAR(30) NOT NULL,
  47. lname VARCHAR(50) NOT NULL,
  48. email VARCHAR(50) NOT NULL,
  49. department INT NOT NULL,
  50. specialization VARCHAR(30) NULL);
  51.  
  52. CREATE PROCEDURE TStudentBecomeTeacher (@p_login CHAR(6), @p_department INT)
  53. AS
  54. BEGIN TRY
  55.     BEGIN TRAN StudentTransaction
  56.     DECLARE
  57.         @v_fname VARCHAR(30), @v_lname VARCHAR(50), @v_email VARCHAR(50);
  58.         SET @v_fname = (SELECT fname FROM Student WHERE login = @p_login);
  59.         SET @v_lname = (SELECT lname FROM Student WHERE login = @p_login);
  60.         SET @v_email = (SELECT email FROM Student WHERE login = @p_login);
  61.        
  62.         INSERT INTO Teacher(login, fname, lname, email, department) VALUES(@p_login, @v_fname, @v_lname, @v_email, @p_department);
  63.         PRINT 'COMMIT'
  64.         COMMIT;
  65. END TRY
  66. BEGIN CATCH
  67.     PRINT 'ROLLBACK'
  68.     ROLLBACK;
  69. END CATCH
  70.  
  71. GO
  72. EXECUTE StudentBecomeTeacher 'BED05','2';
  73. EXECUTE TStudentBecomeTeacher 'DOR023','1';
  74.  
  75. -- 5
  76. CREATE TABLE Student (
  77. login CHAR(6) PRIMARY KEY,
  78. fname VARCHAR(30) NOT NULL,
  79. lname VARCHAR(50) NOT NULL,
  80. email VARCHAR(50) NOT NULL,
  81. tallness INT NOT NULL);
  82.  
  83. CREATE PROCEDURE AddStudent2 (@p_fname VARCHAR(30), @p_lname VARCHAR(50), @p_tallness INT)
  84. AS
  85. BEGIN
  86. DECLARE
  87.     @v_login VARCHAR(6), @v_email VARCHAR(50);
  88.     SET @v_login = LOWER(SUBSTRING(@p_lname, 1, 3)) + '000';
  89.     SET @v_email = @v_login + '@vsb.cz';
  90.    
  91.     INSERT INTO Student VALUES(@v_login, @p_fname, @p_lname, @v_email, @p_tallness);
  92. END
  93.  
  94. GO
  95. EXECUTE AddStudent2 'Adam','Kosinar','160';
  96.  
  97. -- 6
  98. ALTER TABLE Student ADD isTall BIT NULL;
  99.  
  100. ALTER PROCEDURE IsStudentTall (@p_login CHAR(6))
  101. AS
  102. BEGIN
  103. DECLARE
  104.     @v_average REAL, @v_tallness INT;
  105.     SET @v_average = (SELECT AVG(tallness) FROM Student);
  106.     SET @v_tallness = (SELECT tallness FROM Student WHERE login = @p_login);
  107.    
  108.     IF @v_tallness < @v_average
  109.         UPDATE Student SET isTall = 0 WHERE login = @p_login;
  110.     ELSE
  111.         UPDATE Student SET isTall = 1 WHERE login = @p_login;  
  112. END
  113.  
  114. GO
  115. EXECUTE IsStudentTall 'BED05';
  116.  
  117. -- 7
  118. CREATE FUNCTION LoginExists (@p_login CHAR(6))
  119. RETURNS BIT
  120. AS
  121. BEGIN
  122.     IF EXISTS (SELECT * FROM Student WHERE login = @p_login)
  123.         RETURN 1;
  124.     RETURN 0; /* nevyzaduje else, ked ho tam date vyhodi to exception, ze ako posledny prikaz ma byt return-type, ktory
  125.                  tam pri pouziti else nevidi */
  126. END;
  127.  
  128. GO
  129. BEGIN
  130.     IF (dor0023.LoginExists('DOR023') = 1)
  131.         PRINT 'LOGIN EXISTS';
  132.     ELSE
  133.         PRINT 'LOGIN DOESNT EXIST';
  134. END
  135.  
  136. -- 8
  137. ALTER PROCEDURE AddStudent2Dynamic (@p_fname VARCHAR(30), @p_lname VARCHAR(50), @p_tallness INT)
  138. AS
  139. DECLARE
  140.     @v_login VARCHAR(6), @v_email VARCHAR(50), @v_counter INT;
  141.     SET @v_counter = 0;
  142.     SET @v_login = LOWER(SUBSTRING(@p_lname,1, 3)) + '0' + CAST(@v_counter AS CHAR);
  143. WHILE dor0023.LoginExists(@v_login) <> 0
  144.     BEGIN
  145.         SET @v_counter = @v_counter + 1;
  146.         IF @v_counter < 100
  147.             SET @v_login = LOWER(SUBSTRING(@p_lname,1, 3)) + '0' + CAST(@v_counter AS CHAR);
  148.         ELSE
  149.             SET @v_login = LOWER(SUBSTRING(@p_lname,1, 3)) + CAST(@v_counter AS CHAR);
  150.     END
  151. SET @v_email = @v_login + '@vsb.cz';
  152. INSERT INTO Student(login, fname, lname, email, tallness) VALUES(@v_login, @p_fname, @p_fname, @v_email, @p_tallness);
  153.  
  154. GO
  155. EXECUTE AddStudent2Dynamic 'Rudolf','Pecinovsky','178';
  156.  
  157. SELECT * FROM Student ORDER BY login ASC;
  158.  
  159. -- 9
  160.  
  161. CREATE PROCEDURE SetStudentTallness
  162. AS
  163. DECLARE @temp_login CHAR(6);
  164. DECLARE kurzor CURSOR FOR SELECT login FROM Student;
  165. OPEN kurzor
  166.     FETCH NEXT FROM kurzor INTO @temp_login
  167.     WHILE @@FETCH_STATUS = 0
  168.         BEGIN
  169.             EXECUTE IsStudentTall @temp_login;
  170.             FETCH NEXT FROM kurzor INTO @temp_login /* posuvam sa na dalsi zaznam bez neho sa to zacykli */
  171.         END
  172. CLOSE kurzor
  173. DEALLOCATE kurzor
  174.  
  175. GO
  176. EXECUTE SetStudentTallness;
  177.  
  178. -- 10
  179. CREATE PROCEDURE CopyTableStructure(@p_table_schema VARCHAR(10), @p_table_name VARCHAR(20))
  180. AS
  181. DECLARE kurzor CURSOR FOR SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS
  182. WHERE TABLE_SCHEMA = @p_table_schema AND TABLE_NAME = @p_table_name;
  183. DECLARE @retazec VARCHAR(500), @column_name VARCHAR(30), @column_type VARCHAR(30), @column_length INT;
  184. SET @retazec = 'CREATE TABLE ' + @p_table_name + '_OLD (';
  185. OPEN kurzor
  186.     FETCH NEXT FROM kurzor INTO @column_name, @column_type, @column_length;
  187.     WHILE @@FETCH_STATUS = 0
  188.         BEGIN
  189.             IF (@column_length IS NOT NULL)
  190.                 SET @retazec = @retazec + @column_name + ' ' + @column_type + '(' + CAST(@column_length AS VARCHAR) + '),';
  191.             ELSE
  192.                 SET @retazec = @retazec + @column_name + ' ' + @column_type + ',';
  193.         FETCH NEXT FROM kurzor INTO @column_name, @column_type, @column_length;    
  194.         END
  195.         SET @retazec = SUBSTRING(@retazec, 1, (LEN(@retazec) - 1)) + ');';
  196.         EXECUTE(@retazec);
  197. CLOSE kurzor;
  198. DEALLOCATE kurzor;
  199. PRINT @retazec;
  200.  
  201. GO
  202. EXECUTE CopyTableStructure '<LOGIN>','<TABLE NAME>';
  203.  
  204. -- 11
  205. CREATE TABLE "Statistics" (
  206.     operation VARCHAR(20) NOT NULL,
  207.     operationCount INT NULL
  208. );
  209. INSERT INTO "Statistics"(operation) VALUES('INSERT');
  210. INSERT INTO "Statistics"(operation) VALUES('UPDATE');
  211. INSERT INTO "Statistics"(operation) VALUES('DELETE');
  212. UPDATE "Statistics" SET operationCount = 0;
  213.  
  214. /* TRIGGER FOR INSERT STATISTICS */
  215. CREATE TRIGGER StatisticsOperationCountForInsert
  216. ON Student
  217. AFTER INSERT
  218. AS
  219. BEGIN
  220.     UPDATE "Statistics" SET operationCount = operationCount + 1 WHERE operation = 'INSERT';
  221.     PRINT 'operationCount was updated';
  222. END
  223.  
  224. /* TRIGGER FOR UPDATE STATISTICS */
  225. CREATE TRIGGER StatistiscOperationCountForUpdate
  226. ON Student
  227. AFTER UPDATE
  228. AS
  229. BEGIN
  230.     UPDATE "Statistics" SET operationCount = operationCount + 1 WHERE operation = 'UPDATE';
  231.     PRINT 'operationCount was updated';
  232. END
  233.  
  234. /* TRIGGER FOR DELETE STATISTICS */
  235. CREATE TRIGGER StatisticsOperationCountForDelete
  236. ON Student
  237. AFTER DELETE
  238. AS
  239. BEGIN
  240.     UPDATE "Statistics" SET operationCount = operationCount + 1 WHERE operation = 'DELETE';
  241.     PRINT 'operationCount was updated';
  242. END
  243.  
  244. -- 12
  245. CREATE TABLE Kurz(
  246.     id_kurzu CHAR(6) PRIMARY KEY NOT NULL,
  247.     nazov VARCHAR(50) NOT NULL,
  248.     kapacita INT NOT NULL
  249. );
  250.  
  251. CREATE TABLE StudijniPlan(
  252.     id_kurzu CHAR(6) NOT NULL,
  253.     login CHAR(6) NOT NULL
  254. );
  255.  
  256. ALTER TABLE StudijniPlan
  257.     ADD CONSTRAINT fk_login
  258.     FOREIGN KEY (login)
  259.     REFERENCES Student(login);
  260.  
  261. ALTER TABLE StudijniPlan
  262.     ADD CONSTRAINT fk_id_kurzu
  263.     FOREIGN KEY (id_kurzu)
  264.     REFERENCES Kurz(id_kurzu)
  265.    
  266. INSERT INTO Kurz VALUES('DAIS','Databázové a informačné systémy','5');
  267. INSERT INTO Kurz VALUES('SWS','Správa windows systémov','10');
  268. INSERT INTO Kurz VALUES('VIS','Vývoj informačných systémov','8');
  269. INSERT INTO Kurz VALUES('JAT','Java technógie','20');
  270. INSERT INTO Kurz VALUES('SWI','Úvod do softwarového inžiniestva','20');
  271.  
  272. INSERT INTO StudijniPlan VALUES('DAIS','DOR023');
  273. INSERT INTO StudijniPlan VALUES('DAIS','USER1');
  274. INSERT INTO StudijniPlan VALUES('DAIS','USER2');
  275. INSERT INTO StudijniPlan VALUES('DAIS','USER3');
  276. INSERT INTO StudijniPlan VALUES('DAIS','USER4');
  277. INSERT INTO StudijniPlan VALUES('DAIS','USER5');
  278. INSERT INTO StudijniPlan VALUES('DAIS','USER6');
  279. INSERT INTO StudijniPlan VALUES('DAIS','USER7');
  280. INSERT INTO StudijniPlan VALUES('DAIS','USER8');
  281. INSERT INTO StudijniPlan VALUES('DAIS','USER9');
  282. INSERT INTO StudijniPlan VALUES('VIS','USER1');
  283. INSERT INTO StudijniPlan VALUES('VIS','USER2');
  284. INSERT INTO StudijniPlan VALUES('VIS','USER3');
  285. INSERT INTO StudijniPlan VALUES('VIS','USER4');
  286. INSERT INTO StudijniPlan VALUES('JAT','DOR023');
  287.  
  288.  
  289. /* POMOCNA PROCEDURKA PRE VLOZENIE X ZAZNAMOV DO TABULKY */
  290. CREATE PROCEDURE AddDataToStudent
  291. AS
  292. DECLARE @login CHAR(6), @fname VARCHAR(30), @lname VARCHAR(50), @email VARCHAR(50), @counter INT;
  293. SET @counter = 0;
  294. WHILE @counter < 30
  295. BEGIN
  296.     SET @counter = @counter + 1;
  297.     SET @login = 'USER' + CAST(@counter AS VARCHAR);
  298.     SET @fname = 'FIRSTNAME' + CAST(@counter AS VARCHAR);
  299.     SET @lname = 'SURNAME' + CAST(@counter AS VARCHAR);
  300.     SET @email = 'FIRST' + CAST(@counter AS VARCHAR) + '.SURNAME' + CAST(@counter AS VARCHAR) + '@VSB.CZ';
  301.     INSERT INTO Student(login, fname, lname, email) VALUES(@login, @fname, @lname, @email);
  302. END
  303. GO
  304. EXECUTE AddDataToStudent;
  305.  
  306. CREATE TRIGGER ControlOfCapacity
  307. ON StudijniPlan
  308. FOR INSERT
  309. AS
  310. BEGIN
  311. DECLARE @id_kurzu CHAR(6), @pocet_ludi INT;
  312.     SET @id_kurzu = (SELECT id_kurzu FROM INSERTED);
  313.     SET @pocet_ludi = (SELECT COUNT(*) FROM StudijniPlan WHERE (id_kurzu = @id_kurzu));
  314.     IF @pocet_ludi > (SELECT kapacita FROM Kurz WHERE id_kurzu = @id_kurzu)
  315.         PRINT 'WARNING MESSAGE: KAPACITA PREKROCENA';
  316.     ELSE
  317.         PRINT 'KAPACITA NEPREKROCENA'
  318. END
Advertisement
Add Comment
Please, Sign In to add comment