Advertisement
BagaevDanil

Untitled

May 24th, 2023
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.56 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. -- Добавить числовой параметр
  154. create or replace function add_val_parameter(param_id integer, id_product integer, value double precision, description varchar(150))
  155. returns void
  156. language plpgsql
  157. as $$
  158. declare
  159. type integer default null;
  160. value_param_id integer default null;
  161. id_class integer default null;
  162. min_param_value integer default null;
  163. max_param_value integer default null;
  164. begin
  165. select type from parameter where id = param_id and type = 'Числовой';
  166. select product_class_id into id_class from product where id = id_product;
  167.  
  168. select max_value, min_value into max_param_value, min_param_value from product_class_parameter
  169. where id_parameter = param_id and id_product_class = id_class;
  170.  
  171. if type is not null then
  172. if min_param_value is not null then
  173. if min_param_value <= value AND max_param_value >= value THEN
  174. insert into product_parameter (value, info, id_parameter, id_product)
  175. values (value, description, id_parameter, id_product);
  176. else
  177. raise exception 'значение добавляемого параметра не входит в диапазон допустимых параметров';
  178. end if;
  179. else
  180. raise exception 'требуемый параметр не существует';
  181. end if;
  182. else
  183. raise exception 'можно добавить только числовой параметр';
  184. end if;
  185. end;
  186. $$;
  187.  
  188. -- Добавить параметр типа "Перечисление"
  189. create or replace function add_enum_val_parameter(parameter_id integer, id_product integer, value_id integer, description varchar(150))
  190. returns void
  191. language plpgsql
  192. as $$
  193. declare
  194. type integer default null;
  195. enum_id integer default null;
  196. parameter_enum_id integer default null;
  197. id_class integer default null;
  198. begin
  199. select type from parameter where id = parameter_id and type = 'Перечисление';
  200. select id into enum_id from enum_value where id = value_id;
  201. select id_enum into parameter_enum_id from parameter where id = parameter_id;
  202. select product_class_id into id_class from product where id = id_product;
  203.  
  204. if type is not null then
  205. if enum_id = parameter_enum_id and enum_id is not null then
  206. if exists(select * from product_class_parameter where id_parameter = parameter_id
  207. and id_product_class = id_class) then
  208. insert into product_parameter (id_parameter, id_product, value, info)
  209. values(parameter_id, ""."".product_parameter.id_product, value_id, description);
  210. else
  211. raise exception 'требуемый параметр не существует';
  212. end if;
  213. else
  214. raise exception 'значение перечисления не принадлежит типу перечисления';
  215. end if;
  216. else
  217. raise exception 'можно добавить только параметр типа "Перечисление"';
  218. end if;
  219. end;
  220. $$;
  221.  
  222.  
  223.  
  224. -- 3
  225. -- Вернуть таблицу параметров для изделия
  226. CREATE OR REPLACE FUNCTION product_params(prod_id INTEGER)
  227. RETURNS TABLE
  228. (
  229. product VARCHAR(50),
  230. product_class VARCHAR(50),
  231. parameter VARCHAR(50),
  232. enum_value TEXT
  233. )
  234. LANGUAGE plpgsql
  235. AS
  236. $$
  237. BEGIN
  238. RETURN QUERY
  239. (
  240. SELECT
  241. product.name as product,
  242. product_class.name as product_class,
  243. parameter.name as parameter,
  244. CASE
  245. WHEN parameter.type = 'Список'
  246. THEN concat(enum_value.name)
  247. ELSE concat(product_parameter.value, ' ', measure.short_name)
  248. END AS value
  249. FROM product
  250. JOIN product_class ON product_class.id = product.product_class_id
  251. JOIN product_parameter ON product.id = product_parameter.id_product
  252. JOIN parameter ON product_parameter.id_parameter = parameter.id
  253. LEFT JOIN enum_value ON parameter.id_enum = enum_value.id_enum AND product_parameter.value = enum_value.id
  254. LEFT JOIN measure ON parameter.id_measure = measure.id
  255. WHERE
  256. product.id = prod_id
  257. );
  258. END;
  259. $$;
  260.  
  261. SELECT * FROM product_parameter;
  262. SELECT * FROM product_params(6);
  263.  
  264.  
  265.  
  266.  
  267. -- 4
  268. -- Скопировать параметры от класса для класса
  269. -- From_Class_Id - идентификатор класса, от которого необходимо скопировать параметры
  270. CREATE FUNCTION copy_class_params(id_from INTEGER, id_to INTEGER)
  271. RETURNS VOID AS $$
  272. BEGIN
  273. UPDATE
  274. product_class_parameter
  275. SET
  276. min_value = (
  277. SELECT min_value
  278. FROM product_class_parameter
  279. WHERE id = id_from
  280. ),
  281. max_value = (
  282. SELECT max_value
  283. FROM product_class_parameter
  284. WHERE id = id_from
  285. )
  286. WHERE product_class_parameter.id = id_to;
  287. END; $$
  288. LANGUAGE plpgsql;
  289.  
  290. SELECT * FROM product_class_parameter;
  291. SELECT copy_class_params(1, 2);
  292.  
  293.  
  294. --5
  295. -- Просмотреть содержимое агрегата
  296. --Arg_Id - идентификатор агрегата
  297. -- Возвращает аблицу со столбцами Позиция, Краткое Имя, Имя
  298. CREATE OR REPLACE FUNCTION aregate_content(pos INTEGER)
  299. RETURNS TABLE
  300. (
  301. p_position int,
  302. p_name varchar(100),
  303. p_short_name varchar(45)
  304. )
  305. LANGUAGE plpgsql
  306. AS
  307. $$
  308. BEGIN
  309. RETURN QUERY
  310. (
  311. SELECT
  312. parameter.position, parameter.name, parameter.type
  313. FROM
  314. parameter
  315. WHERE
  316. parameter.position = pos
  317. );
  318. END;
  319. $$
  320.  
  321. SELECT * FROM parameter;
  322. SELECT * FROM aregate_content(2);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement