Advertisement
sesquiipedalian

ВТОРОЕ ЗАДАНИЕ

May 4th, 2023
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 13.96 KB | None | 0 0
  1. #1 Function that returns all records based on a pattern (example of pattern: part of name, surname, phone number):
  2.  
  3. CREATE OR REPLACE FUNCTION search_pattern(pattern VARCHAR)
  4. RETURNS TABLE (
  5.     user_id INT,
  6.     first_name VARCHAR,
  7.     last_name VARCHAR,
  8.     phone_number VARCHAR
  9. ) AS $$
  10. BEGIN
  11.     RETURN QUERY
  12.     SELECT * FROM phonebook
  13.     WHERE first_name ILIKE '%' || pattern || '%'
  14.        OR last_name ILIKE '%' || pattern || '%'
  15.        OR phone_number ILIKE '%' || pattern || '%';
  16. END;
  17. $$ LANGUAGE plpgsql;
  18.  
  19. """
  20.  
  21. Этот код создает или заменяет функцию PostgreSQL с именем search_pattern с параметром pattern типа VARCHAR. Функция возвращает таблицу с полями user_id, first_name, last_name и phone_number.
  22.  
  23. Структура функции:
  24.  
  25. CREATE OR REPLACE FUNCTION search_pattern(pattern VARCHAR): Создает или заменяет функцию с именем search_pattern и одним параметром pattern типа VARCHAR.
  26. RETURNS TABLE (user_id INT, first_name VARCHAR, last_name VARCHAR, phone_number VARCHAR): Определяет структуру возвращаемой таблицы, которая состоит из полей user_id, first_name, last_name и phone_number.
  27. AS $$: Начало тела функции.
  28. BEGIN: Начало блока кода функции.
  29. RETURN QUERY: Возвращает результат SQL-запроса.
  30. SELECT * FROM phonebook WHERE first_name ILIKE '%' || pattern || '%' OR last_name ILIKE '%' || pattern || '%' OR phone_number ILIKE '%' || pattern || '%': Выполняет SQL-запрос, который выбирает все записи из таблицы phonebook, у которых значение first_name, last_name или phone_number содержит переданный pattern. Используется оператор ILIKE для регистронезависимого поиска с использованием шаблонов.
  31. END;: Окончание блока кода функции.
  32. $$ LANGUAGE plpgsql;: Окончание тела функции и указание языка функции (plpgsql).
  33.  
  34.  
  35. ПРИМЕР ИСПОЛЬЗОВАНИЯ:
  36.  
  37. SELECT * FROM search_pattern('your_pattern');
  38.  
  39. """
  40.  
  41. #2 Create procedure to insert new user by name and phone, update phone if user already exists:
  42.  
  43. CREATE OR REPLACE PROCEDURE insert_or_update_user(first_name VARCHAR, last_name VARCHAR, phone_number VARCHAR)
  44. AS $$
  45. DECLARE
  46.     existing_user_id INT;
  47. BEGIN
  48.     SELECT user_id INTO existing_user_id FROM phonebook WHERE first_name = first_name AND last_name = last_name;
  49.  
  50.     IF existing_user_id IS NULL THEN
  51.         INSERT INTO phonebook (first_name, last_name, phone_number) VALUES (first_name, last_name, phone_number);
  52.     ELSE
  53.         UPDATE phonebook SET phone_number = phone_number WHERE user_id = existing_user_id;
  54.     END IF;
  55. END;
  56. $$ LANGUAGE plpgsql;
  57.  
  58. """
  59.  
  60. Этот код создает или заменяет процедуру PostgreSQL с именем insert_or_update_user с параметрами first_name, last_name, и phone_number типа VARCHAR. Процедура вставляет нового пользователя в таблицу phonebook или обновляет существующего пользователя, если он уже существует.
  61.  
  62. Структура процедуры:
  63.  
  64. CREATE OR REPLACE PROCEDURE insert_or_update_user(first_name VARCHAR, last_name VARCHAR, phone_number VARCHAR): Создает или заменяет процедуру с именем insert_or_update_user и тремя параметрами first_name, last_name, и phone_number типа VARCHAR.
  65. AS $$: Начало тела процедуры.
  66. DECLARE: Определяет начало блока объявления переменных.
  67. existing_user_id INT;: Объявляет переменную existing_user_id типа INT.
  68. BEGIN: Начало блока кода процедуры.
  69. SELECT user_id INTO existing_user_id FROM phonebook WHERE first_name = first_name AND last_name = last_name;: Выполняет SQL-запрос, который выбирает значение user_id из таблицы phonebook для записи с переданными значениями first_name и last_name. Значение user_id сохраняется в переменную existing_user_id.
  70. IF existing_user_id IS NULL THEN: Если переменная existing_user_id равна NULL (т.е. пользователь с переданными first_name и last_name не найден), то:
  71. a. INSERT INTO phonebook (first_name, last_name, phone_number) VALUES (first_name, last_name, phone_number);: Вставляет нового пользователя с переданными значениями first_name, last_name, и phone_number в таблицу phonebook.
  72. ELSE: В противном случае (если пользователь уже существует):
  73. a. UPDATE phonebook SET phone_number = phone_number WHERE user_id = existing_user_id;: Обновляет значение phone_number для существующего пользователя с найденным значением user_id в таблице phonebook.
  74. END IF;: Окончание блока условного оператора IF.
  75. END;: Окончание блока кода процедуры.
  76. $$ LANGUAGE plpgsql;: Окончание тела процедуры и указание языка процедуры (plpgsql).
  77.  
  78. ПРИМЕР ИСПОЛЬЗОВАНИЯ:
  79.  
  80. CALL insert_or_update_user('first_name_value', 'last_name_value', 'phone_number_value');
  81.  
  82. """
  83.  
  84. #3 Create procedure to insert many new users by list of name and phone. Use loop and if statement in stored procedure. Check correctness of phone in procedure and return all incorrect data:
  85.  
  86.  
  87. CREATE OR REPLACE FUNCTION validate_phone_number(p_phone_number VARCHAR)
  88. RETURNS BOOLEAN AS $$
  89. BEGIN
  90.     RETURN (p_phone_number ~ '^[0-9]{3}-[0-9]{3}-[0-9]{4}$');
  91. END;
  92. $$ LANGUAGE plpgsql;
  93.  
  94. CREATE OR REPLACE PROCEDURE insert_users_with_validation(users_data JSONB)
  95. AS $$
  96. DECLARE
  97.     user_data JSONB;
  98.     incorrect_data JSONB[] DEFAULT '{}';
  99. BEGIN
  100.     FOR user_data IN SELECT * FROM jsonb_array_elements(users_data)
  101.     LOOP
  102.         IF validate_phone_number(user_data->>'phone_number') THEN
  103.             CALL insert_or_update_user(user_data->>'first_name', user_data->>'last_name', user_data->>'phone_number');
  104.         ELSE
  105.             incorrect_data := incorrect_data || user_data;
  106.         END IF;
  107.     END LOOP;
  108.  
  109.     RAISE NOTICE 'Incorrect data: %', incorrect_data;
  110. END;
  111. $$ LANGUAGE plpgsql;
  112.  
  113. """
  114.  
  115. Этот код создает две функции PostgreSQL: validate_phone_number и insert_users_with_validation. Функция validate_phone_number проверяет, является ли переданный номер телефона корректным, в то время как процедура insert_users_with_validation выполняет вставку пользователей в таблицу phonebook, предварительно проверив корректность номера телефона. Если номер телефона некорректный, он добавляется в массив incorrect_data.
  116.  
  117. validate_phone_number:
  118. a. Создает функцию с именем validate_phone_number и одним параметром p_phone_number типа VARCHAR.
  119. b. Функция возвращает BOOLEAN значение.
  120. c. Внутри функции используется регулярное выражение для проверки корректности номера телефона.
  121. insert_users_with_validation:
  122. a. Создает процедуру с именем insert_users_with_validation и одним параметром users_data типа JSONB.
  123. b. Внутри процедуры объявляются переменные user_data типа JSONB и incorrect_data типа JSONB[].
  124. c. Процедура выполняет цикл для каждого элемента массива users_data.
  125. d. В каждом шаге цикла проверяется корректность номера телефона с использованием функции validate_phone_number.
  126. e. Если номер телефона корректный, вызывается процедура insert_or_update_user для вставки или обновления пользователя в таблице phonebook.
  127. f. Если номер телефона некорректный, пользователь добавляется в массив incorrect_data.
  128. g. После завершения цикла, выводится уведомление с содержимым массива incorrect_data.
  129.  
  130. ПРИМЕР ИСПОЛЬЗОВАНИЯ:
  131.  
  132. CALL insert_users_with_validation('[{"first_name": "John", "last_name": "Doe", "phone_number": "123-456-7890"}, ...]');
  133.  
  134.  
  135. """
  136.  
  137. #4 Create function to querying data from the tables with pagination (by limit and offset):
  138.  
  139. CREATE OR REPLACE FUNCTION query_data_with_pagination(limit_val INT, offset_val INT)
  140. RETURNS TABLE (
  141.     user_id INT,
  142.     first_name VARCHAR,
  143.     last_name VARCHAR,
  144.     phone_number VARCHAR
  145. ) AS $$
  146. BEGIN
  147.     RETURN QUERY
  148.     SELECT * FROM phonebook
  149.     ORDER BY user_id
  150.     LIMIT limit_val
  151.     OFFSET offset_val;
  152. END;
  153. $$ LANGUAGE plpgsql;
  154.  
  155. """
  156.  
  157. Этот код создаёт функцию PostgreSQL с именем query_data_with_pagination, которая выполняет выборку данных из таблицы phonebook с использованием пагинации. Функция принимает два параметра: limit_val и offset_val, представляющие собой значения ограничения и смещения для пагинации соответственно.
  158.  
  159. Структура функции:
  160.  
  161. CREATE OR REPLACE FUNCTION query_data_with_pagination(limit_val INT, offset_val INT): Создаёт или заменяет функцию с именем query_data_with_pagination и двумя параметрами: limit_val типа INT и offset_val типа INT.
  162. RETURNS TABLE: Указывает, что функция будет возвращать таблицу с определёнными полями.
  163. user_id INT, first_name VARCHAR, last_name VARCHAR, phone_number VARCHAR: Определяет столбцы возвращаемой таблицы и их типы.
  164. AS $$: Начало тела функции.
  165. BEGIN: Начало блока кода функции.
  166. RETURN QUERY: Указывает, что функция будет возвращать результат выполнения SQL-запроса.
  167. SELECT * FROM phonebook: Выбирает все записи из таблицы phonebook.
  168. ORDER BY user_id: Сортирует результат по столбцу user_id.
  169. LIMIT limit_val: Ограничивает количество возвращаемых строк значением limit_val.
  170. OFFSET offset_val;: Пропускает первые offset_val строк результата.
  171. END;: Окончание блока кода функции.
  172. $$ LANGUAGE plpgsql;: Окончание тела функции и указание языка функции (plpgsql).
  173.  
  174. ПРИМЕР ИСПОЛЬЗОВАНИЯ:
  175.  
  176. SELECT * FROM query_data_with_pagination(10, 0);
  177.  
  178. """
  179. #5 Implement procedure to deleting data from tables by username or phone:
  180.  
  181. CREATE OR REPLACE PROCEDURE delete_data_by_username_or_phone(first_name VARCHAR DEFAULT NULL, phone_number VARCHAR DEFAULT NULL)
  182. AS $$
  183. BEGIN
  184.     DELETE FROM phonebook
  185.     WHERE (first_name IS NOT NULL AND first_name = first_name)
  186.        OR (phone_number IS NOT NULL AND phone_number = phone_number);
  187. END;
  188. $$ LANGUAGE plpgsql;
  189.  
  190. """
  191.  
  192. Этот код создает процедуру PostgreSQL с именем delete_data_by_username_or_phone, которая удаляет записи из таблицы phonebook по имени пользователя или номеру телефона. Процедура принимает два параметра: first_name и phone_number, которые имеют значение по умолчанию NULL.
  193.  
  194. Структура процедуры:
  195.  
  196. CREATE OR REPLACE PROCEDURE delete_data_by_username_or_phone(first_name VARCHAR DEFAULT NULL, phone_number VARCHAR DEFAULT NULL): Создает или заменяет процедуру с именем delete_data_by_username_or_phone и двумя параметрами: first_name типа VARCHAR с значением по умолчанию NULL и phone_number типа VARCHAR с значением по умолчанию NULL.
  197.  
  198. AS $$: Начало тела процедуры.
  199. BEGIN: Начало блока кода процедуры.
  200. DELETE FROM phonebook: Указывает, что процедура будет удалять записи из таблицы phonebook.
  201. WHERE (first_name IS NOT NULL AND first_name = first_name) OR (phone_number IS NOT NULL AND phone_number = phone_number);: Условие, которое определяет, какие записи будут удалены. Если передано значение first_name, удаляются все записи с таким именем. Если передано значение phone_number, удаляются все записи с таким номером телефона.
  202. END;: Окончание блока кода процедуры.
  203. $$ LANGUAGE plpgsql;: Окончание тела процедуры и указание языка процедуры (plpgsql).
  204. Для вызова этой процедуры в SQL-запросе, используйте следующий синтаксис:
  205.  
  206. ПРИМЕР ИСПОЛЬЗОВАНИЯ:
  207.  
  208. CALL delete_data_by_username_or_phone('John', NULL);
  209.  
  210. """
  211.  
  212.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement