Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 7.52 KB | None | 0 0
  1. --Создаем таблицу "Клиенты"
  2. CREATE TABLE Clients (id_klienta NUMBER(5),
  3. Familiya varchar2(30) NOT NULL,
  4. Imya varchar2(15) NOT NULL,
  5. Otchestvo varchar2(30) NOT NULL,
  6. Nomer_telefona NUMBER(11) NOT NULL UNIQUE,
  7. CONSTRAINT PK_klient PRIMARY KEY (id_klienta));
  8.  
  9. --Создаем таблицу "Услуги"
  10. CREATE TABLE Uslugi (id_uslugi NUMBER(2),
  11. razmer varchar2(5) NOT NULL UNIQUE,
  12. tsena NUMBER(3) NOT NULL,
  13. CONSTRAINT PK_usluga PRIMARY KEY (id_uslugi));
  14.  
  15. --Создаем таблицу "Фотографы"
  16. CREATE TABLE Fotografy (id_fotografa NUMBER(3),
  17. Imya_fotografa varchar2(15) NOT NULL,
  18. CONSTRAINT PK_fotograf PRIMARY KEY (id_fotografa));
  19.  
  20. --Создаем таблицу "Заказы"
  21. CREATE TABLE Zakazy (id_zakaza NUMBER(5),
  22. id_uslugi NUMBER(2),
  23. id_klienta NUMBER(5),
  24. data_vyp_zakaza DATA,
  25. kol_vo NUMBER(4) NOT NULL,
  26. id_fotografa NUMBER(3),
  27. CONSTRAINT FK_PK_fotograf FOREIGN KEY (id_fotografa) REFERENCES Fotografy (id_fotografa),
  28. CONSTRAINT FK_PK_usluga FOREIGN KEY (id_uslugi) REFERENCES Uslugi (id_uslugi),
  29. CONSTRAINT FK_PK_klient FOREIGN KEY (id_klienta) REFERENCES Clients (id_klienta),
  30. CONSTRAINT PK_nomer_zakaza PRIMARY KEY (id_zakaza));
  31.  
  32. --Проверяем таблицы по заданию лабы №1
  33. DESCRIBE Clients;
  34. DESCRIBE Uslugi;
  35. DESCRIBE Fotografy;
  36. DESCRIBE Zakazy;
  37.  
  38. --Заполняем таблицу "Клиенты"
  39. INSERT INTO Clients VALUES (1, 'Petrov', 'Nikolay', 'Nikolaevich', 9330305520);
  40. INSERT INTO Clients VALUES (2, 'Ivanov', 'Ivan', 'Nikolaevich', 9620306022);
  41. INSERT INTO Clients VALUES (3, 'Vasilyev', 'Petr', 'Andreevich', 9200335033);
  42. INSERT INTO Clients VALUES (4, 'Semenova', 'Olga', 'Vladimirovna', 9600999024);
  43. INSERT INTO Clients VALUES (5, 'Sokolova', 'Lyudmila', 'Olegovna', 9620305020);
  44.  
  45. --Заполняем таблицу "Услуги"
  46. INSERT INTO Uslugi VALUES (1, '10x15', 20);
  47. INSERT INTO Uslugi VALUES (2, '15x20', 40);
  48. INSERT INTO Uslugi VALUES (3, '20x30', 60);
  49. INSERT INTO Uslugi VALUES (4, '30x40', 80);
  50.  
  51. --Заполняем таблицу "Фотографы"
  52. INSERT INTO Fotografy VALUES (1, 'Irina');
  53. INSERT INTO Fotografy VALUES (2, 'Andrey');
  54. INSERT INTO Fotografy VALUES (3, 'Alexandr');
  55. INSERT INTO Fotografy VALUES (4, 'Marina');
  56. INSERT INTO Fotografy VALUES (5, 'Nikolay');
  57. INSERT INTO Fotografy VALUES (6, 'Edgar');
  58.  
  59. --Заполняем таблицу "Заказы"
  60. INSERT INTO Zakazy VALUES (1, 4, 5, to_data ('11/06/05','DD/MM/YY'), 5, 4);
  61. INSERT INTO Zakazy VALUES (2, 2, 4, to_data ('12/06/05','DD/MM/YY'), 15, 6);
  62. INSERT INTO Zakazy VALUES (3, 1, 1, to_data ('12/06/05','DD/MM/YY'), 30, 2);
  63. INSERT INTO Zakazy VALUES (4, 3, 3, to_data ('12/06/05','DD/MM/YY'), 1, 1);
  64. INSERT INTO Zakazy VALUES (5, 1, 2, to_data ('16/06/05','DD/MM/YY'), 7, 3);
  65. INSERT INTO Zakazy VALUES (6, 2, 1, to_data ('21/06/05','DD/MM/YY'), 10, 5);
  66. INSERT INTO Zakazy VALUES (7, 3, 4, to_data ('21/06/05','DD/MM/YY'), 12, 1);
  67. INSERT INTO Zakazy VALUES (8, 1, 3, to_data ('22/06/05','DD/MM/YY'), 6, 3);
  68. INSERT INTO Zakazy VALUES (9, 2, 2, to_data ('24/06/05','DD/MM/YY'), 4, 2);
  69. INSERT INTO Zakazy VALUES (10, 3, 5, to_data ('26/06/05','DD/MM/YY'), 2, 4);
  70.  
  71. --Выводим все четыре таблицы на экран для проверки
  72. SELECT * FROM Clients;
  73. SELECT * FROM Uslugi;
  74. SELECT * FROM Fotografy;
  75. SELECT * FROM Zakazy;
  76.  
  77.  --Подсчитываем кол-во клиентов, заказавших фото 10х15, сортируя по id клиента
  78. SELECT COUNT(id_klienta) FROM Zakazy
  79. WHERE id_uslugi = 1
  80. ORDER BY id_klienta ASC;
  81.  
  82.  --Получаем сведения о клиентах и фотографах, где в заказе фото 10х15
  83. SELECT id_klienta, id_fotografa FROM Zakazy
  84. WHERE id_uslugi = 1
  85. GROUP BY id_klienta
  86. ORDER BY id_klienta ASC;
  87.  
  88.  --Выводим список клиентов, сделавших заказ 21 или 22 июня
  89. SELECT id_klienta FROM Zakazy
  90. WHERE data_vyp_zakaza = '21/06/05' OR data_vyp_zakaza = '22/06/05';
  91.  
  92.  --Получаем ФИО, умножаем цену на кол-во фото и прибавляем +10%
  93. SELECT Familiya, Imya, Otchestvo FROM Clients
  94. WHERE (SELECT tsena FROM Uslugi
  95.         WHERE (SELECT kol_vo FROM Zakazy
  96.             WHERE (SELECT kol_vo * tsena * 1.1 AS stoimost) ) )
  97. GROUP BY Familiya;
  98.  
  99. --Добавляем данные о новом клиенте и проверяем
  100. INSERT INTO Clients VALUES (6, 'Globa', 'Tatyana', 'Dmitrievna', 9333027733);
  101. SELECT * FROM Clients;
  102.  
  103. --Делаем скидку 2% для тех, кто сделал заказ 12 июня (умножая цену на кол-во и отнимая 2%)
  104. SELECT id_klienta, data_vyp_zakaza, kol_vo FROM Zakazy
  105. WHERE ( (data_vyp_zakaza = '12/06/05') AND (SELECT tsena FROM Uslugi
  106.     WHERE (SELECT kol_vo * tsena AS stoimost2
  107.         WHERE (stoimost2 - (stoimost2 * 2 / 100)) ) ))
  108. GROUP BY id_klienta;
  109.  
  110. --Создаем явный курсор, выводящий данные клиентов, имеющих фамилии, оканчивающиеся на "-ов"
  111. SET serveroutput ON DECLARE
  112. cursor get_surname IS
  113. SELECT * FROM Clients
  114. WHERE Familiya LIKE '%ov';
  115. a get_surname%rowtype;
  116. BEGIN
  117.     OPEN get_surname; loop
  118.     dbms_output.enable;
  119.     dbms_output.put_line('Familii klientov, okanchivauschiesya na "-ov":'||a.Familiya||' '||a.Imya||' '||a.Nomer_telefona);
  120.     fetch get_surname INTO a; exit WHEN get_surname%notfound; END loop; close get_surname; END;
  121. /
  122.    
  123. --Создаем такой же явный курсор, но с параметром
  124. SET serveroutput ON DECLARE
  125. cursor get_surname (inage Familiya) IS
  126. SELECT * FROM Clients
  127. WHERE Familiya = inage;
  128. a get_surname%rowtype;
  129. BEGIN
  130.     OPEN get_surname('ov'); loop
  131.     dbms_output.enable;
  132.     dbms_output.put_line('Familii klientov, okanchivauschiesya na "-ov":'||a.Familiya||' '||a.Imya||' '||a.Nomer_telefona);
  133.     fetch get_surname INTO a; exit WHEN get_surname%notfound; END loop; close get_surname; END;
  134. /
  135.  
  136. --Создаем триггер, позволяющий учитывать, кто и когда вносил данные в таблицу "Заказы"
  137. CREATE OR REPLACE
  138. TRIGGER adt
  139. after INSERT OR DELETE OR UPDATE
  140. ON Zakazy
  141. FOR each ROW DECLARE
  142. BEGIN
  143.     INSERT INTO audit1(Familiya, TIME) VALUES (USER, sysdate);
  144. END adt;
  145.  
  146. --Создаем триггеры ко всем таблицам, позволяющим автоматически
  147. -- вводить данные для полей, являющихся первичным ключом и имеющих числовой тип.
  148. -- Для таблицы "Клиенты":
  149. CREATE SEQUENCE avto START WITH 1 INCREMENT BY 1
  150. /
  151. CREATE OR REPLACE
  152. TRIGGER ident_k
  153. BEFORE INSERT ON Clients
  154. FOR each ROW
  155. DECLARE
  156. BEGIN
  157.     SELECT avto.NEXTVAL
  158.     INTO :NEW.id_klienta
  159.     FROM dual;
  160. END ident_k;
  161. /
  162.  
  163. --Для таблицы "Услуги"
  164. CREATE SEQUENCE avto START WITH 1 INCREMENT BY 1
  165. /
  166. CREATE OR REPLACE
  167. TRIGGER ident_u
  168. BEFORE INSERT ON Uslugi
  169. FOR each ROW
  170. DECLARE
  171. BEGIN
  172.     SELECT avto.NEXTVAL
  173.     INTO :NEW.id_uslugi
  174.     FROM dual;
  175. END ident_u;
  176. /
  177.  
  178. --Для таблицы "Фотографы"
  179. CREATE SEQUENCE avto START WITH 1 INCREMENT BY 1
  180. /
  181. CREATE OR REPLACE
  182. TRIGGER ident_f
  183. BEFORE INSERT ON Fotografy
  184. FOR each ROW
  185. DECLARE
  186. BEGIN
  187.     SELECT avto.NEXTVAL
  188.     INTO :NEW.id_fotografa
  189.     FROM dual;
  190. END ident_f;
  191. /
  192.  
  193. --Для таблицы "Заказы"
  194. CREATE SEQUENCE avto START WITH 1 INCREMENT BY 1
  195. /
  196. CREATE OR REPLACE
  197. TRIGGER ident_z
  198. BEFORE INSERT ON Zakazy
  199. FOR each ROW
  200. DECLARE
  201. BEGIN
  202.     SELECT avto.NEXTVAL
  203.     INTO :NEW.id_zakaza
  204.     FROM dual;
  205. END ident_z;
  206. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement