Advertisement
BagaevDanil

Untitled

May 23rd, 2023
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.66 KB | None | 0 0
  1. --------------------------------------------------------- СОЗДАНИЕ ТАБЛИЦ
  2.  
  3. -- таблица для хранения перечислений
  4. CREATE TABLE enum (
  5. id serial PRIMARY KEY,
  6. name varchar(50),
  7. description varchar(150)
  8. );
  9.  
  10. -- таблица для хранения значений перечислений
  11. CREATE TABLE enum_value (
  12. id serial PRIMARY KEY,
  13. id_enum integer,
  14. position integer,
  15. name varchar(50)
  16. );
  17.  
  18. -- таблица для хранения параметров
  19. CREATE TABLE parameter (
  20. id serial PRIMARY KEY,
  21. name varchar(50),
  22. id_measure integer,
  23. id_enum integer,
  24. type varchar(50),
  25. position integer
  26. );
  27.  
  28. -- таблица для хранения параметров для продуктов
  29. CREATE TABLE product_parameter (
  30. id serial PRIMARY KEY,
  31. value double precision,
  32. info varchar(150),
  33. id_parameter integer,
  34. id_product integer
  35. );
  36.  
  37. -- таблица для хранения параметров для категорий продуктов
  38. CREATE TABLE product_class_parameter (
  39. id serial PRIMARY KEY,
  40. min_value double precision,
  41. max_value double precision,
  42. id_parameter integer,
  43. id_product_class integer
  44. );
  45.  
  46. -- таблица для хранения единиц измерения
  47. create table measure (
  48. id serial PRIMARY KEY,
  49. name varchar (50),
  50. short_name varchar (10)
  51. );
  52.  
  53. -- таблица для хранения классов продукта
  54. create table product_class (
  55. id serial PRIMARY KEY,
  56. name varchar (50),
  57. description varchar(150),
  58. measure_id integer
  59. );
  60.  
  61. -- таблица для хранения экземпляров продуктов
  62. create table product (
  63. id serial PRIMARY KEY,
  64. product_class_id integer,
  65. name varchar (50)
  66. );
  67.  
  68. --------------------------------------------------------- ЗАПОЛНЕНИЕ ТАБЛИЦ
  69.  
  70. -- заполнение таблицы перечислений
  71. INSERT INTO enum
  72. (name, description)
  73. VALUES
  74. ('Производитель', 'Компания или организация, которая занимается производством и изготовлением товаров или услуг.');
  75. SELECT * FROM enum;
  76.  
  77. -- заполнение таблицы значений перечислений
  78. INSERT INTO enum_value
  79. (id_enum, position, name)
  80. VALUES
  81. ('1', '1', 'Bosch'),
  82. ('1', '2', 'Samsung'),
  83. ('1', '3', 'LG'),
  84. ('1', '4', 'Азербайджанские');
  85. SELECT * FROM enum_value;
  86.  
  87. -- заполнение таблицы мер
  88. INSERT INTO measure
  89. (name, short_name)
  90. VALUES
  91. ('Дней', 'Дн.'),
  92. ('Градусы', 'Гр.'),
  93. ('Килограммы', 'Кг.'),
  94. ('Литры', 'Лит.'),
  95. ('Штук', 'Шт.');
  96. SELECT * FROM measure;
  97.  
  98. -- заполнение таблицы категорий продуктов
  99. INSERT INTO product_class
  100. (name, description, measure_id)
  101. VALUES
  102. ('Овощи', 'Сезонные овощи, замороженные продукты, зелень.', 2),
  103. ('Фрукты', 'Сезонные фрукты и орехи, замороженные продукты, экзотические фрукты.', 2),
  104. ('Бытовая техники', 'Холодильники, стиральные и сушильные машины, пылесосы, кухонные плиты, духовки.', 5),
  105. ('Напитки', 'Свежие и пакетированные соки, газировки, вода и морсы.', 4);
  106. SELECT * FROM product_class;
  107.  
  108.  
  109. -- заполнение таблицы продуктов
  110. INSERT INTO product
  111. (name, product_class_id)
  112. VALUES
  113. ('Помидоры', 1),
  114. ('Огурцы', 1),
  115. ('Бананы', 2),
  116. ('Яблоки', 2),
  117. ('Утюги', 3),
  118. ('Пылесос', 3),
  119. ('Сок яблочный', 4),
  120. ('Кока-кола', 4);
  121. SELECT * FROM product;
  122.  
  123. -- заполнение таблицы параметров
  124. INSERT INTO parameter
  125. (name, id_measure, id_enum, type, position)
  126. VALUES
  127. ('Срок годности', 1, null, 'Числовой', 1),
  128. ('Производитель', null, 1, 'Список', 2),
  129. ('Температура хранения', 2, null, 'Числовой', 3);
  130. SELECT * FROM parameter;
  131.  
  132. -- заполнение таблицы параметров для продуктов
  133. INSERT INTO product_parameter
  134. (value, id_parameter, id_product)
  135. VALUES
  136. (30, 1, 1),
  137. (720, 1, 5),
  138. (2, 2, 6),
  139. (4, 2, 1);
  140. SELECT * FROM product_parameter;
  141.  
  142. -- заполнение таблицы параметров для категорий продуктов
  143. INSERT INTO product_class_parameter
  144. (min_value, max_value, id_parameter, id_product_class)
  145. VALUES
  146. (10, 90, 1, 1),
  147. (-999, 999, 7, 7);
  148. SELECT * FROM product_class_parameter;
  149.  
  150.  
  151. --------------------------------------------------------- СОЗДАНИЕ ФУНКЦИЙ
  152.  
  153. -- 3
  154. -- Вернуть таблицу параметров для изделия
  155. -- Prod_Id - идентификатор изделия
  156. -- Возвращает таблицу со столбцами Имя Изделия, Группа Изделия, Параметр, Значение
  157. CREATE OR REPLACE FUNCTION product_params(prod_id INTEGER)
  158. RETURNS TABLE
  159. (
  160. product VARCHAR(50),
  161. product_class VARCHAR(50),
  162. parameter VARCHAR(50),
  163. enum_value TEXT
  164. )
  165. LANGUAGE plpgsql
  166. AS
  167. $$
  168. BEGIN
  169. RETURN QUERY
  170. (
  171. SELECT
  172. product.name as product,
  173. product_class.name as product_class,
  174. parameter.name as parameter,
  175. CASE
  176. WHEN parameter.type = 'Список'
  177. THEN concat(enum_value.name)
  178. ELSE concat(product_parameter.value, ' ', measure.short_name)
  179. END AS value
  180. FROM product
  181. JOIN product_class ON product_class.id = product.product_class_id
  182. JOIN product_parameter ON product.id = product_parameter.id_product
  183. JOIN parameter ON product_parameter.id_parameter = parameter.id
  184. LEFT JOIN enum_value ON parameter.id_enum = enum_value.id_enum AND product_parameter.value = enum_value.id
  185. LEFT JOIN measure ON parameter.id_measure = measure.id
  186. WHERE
  187. product.id = prod_id
  188. );
  189. END;
  190. $$;
  191.  
  192. --DROP FUNCTION product_params(integer)
  193. SELECT * FROM product;
  194. SELECT * FROM product_params(1);
  195.  
  196.  
  197.  
  198.  
  199. -- 4
  200. -- Скопировать параметры от класса для класса
  201. -- From_Class_Id - идентификатор класса, от которого необходимо скопировать параметры
  202. CREATE FUNCTION copy_class_params(id_from INTEGER, id_to INTEGER)
  203. RETURNS VOID AS $$
  204. BEGIN
  205. UPDATE
  206. product_class_parameter
  207. SET
  208. min_value = (
  209. SELECT min_value
  210. FROM product_class_parameter
  211. WHERE id = id_from
  212. ),
  213. max_value = (
  214. SELECT max_value
  215. FROM product_class_parameter
  216. WHERE id = id_from
  217. )
  218. WHERE product_class_parameter.id = id_to;
  219. END; $$
  220. LANGUAGE plpgsql;
  221.  
  222. DROP FUNCTION copy_min_value(INTEGER, INTEGER);
  223.  
  224. SELECT * FROM product_class_parameter;
  225. SELECT copy_min_value(1, 2);
  226.  
  227.  
  228. --5
  229. -- Просмотреть содержимое агрегата
  230. --Arg_Id - идентификатор агрегата
  231. -- Возвращает аблицу со столбцами Позиция, Краткое Имя, Имя
  232. CREATE OR REPLACE FUNCTION aregate_content(pos INTEGER)
  233. RETURNS TABLE
  234. (
  235. p_position int,
  236. p_name varchar(100),
  237. p_short_name varchar(45)
  238. )
  239. LANGUAGE plpgsql
  240. AS
  241. $$
  242. BEGIN
  243. RETURN QUERY
  244. (
  245. SELECT
  246. parameter.position, parameter.name, parameter.type
  247. FROM
  248. parameter
  249. WHERE
  250. parameter.position = pos
  251. );
  252. END;
  253. $$
  254.  
  255. SELECT * FROM parameter;
  256. SELECT * FROM aregate_content(1);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement