PSQL-01. Основы PL/pgSQL — курсы в Санкт-Петербурге
Целью реализации программы (учебного модуля) «PSQL-01. Основы PL/pgSQL» является формирование у слушателей специальных знаний и компетенций, необходимых для разработки программных модулей в базах данных PostgreSQL на основе использования языков SQL и PL/pgSQL.
В результате освоения модуля обучающийся должен уметь:
• использовать различные типы данных и функции в запросах SQL и PL/pgSQL;
• создавать функции и триггера на языке PL/pgSQL;
• конструировать код запросов динамически из кода приложения;
• работать с курсорами;
• работать с массивами;
• настраивать триггеры, проводить перехват ошибок в исполняемом коде.
В результате освоения модуля обучающийся должен знать:
• преимущества использования PL/pgSQL;
• основы языка PL/pgSQL;
• встроенные функции PostgreSQL;
• поддерживаемые типы данных аргументов и возвращаемых значений.
В результате освоения модуля обучающийся должен приобрести практический опыт:
• использования различных типов данных и функций в запросах SQL и PL/pgSQL;
• разработки и отладки блоков кода на языке PL/pgSQL.
Тема 1. Основы языка PL/pgSQL
1.1 PL/pgSQL — процедурный язык SQL
Введение в язык PL/pgSQL.
Общие сведения о процедурных языках.
Работа с переменными и выражениями.
Основные операторы.
1.2 Управляющие структуры
Блоки и их структура.
Условные операторы.
Простые циклы.
Цикл по результатам запроса
1.3 Пользовательские функции
Использование функций в PL/pgSQL.
Создание пользовательских функций.
Объявление параметров функции.
Практические занятия
Написание функций в PL/pgSQL
Тема 2. Работа с запросами SQL в PL/pgSQL
2.1 SQL-операторы и выражения внутри функции на PL/pgSQL
Выполнение инструкций SQL.
Подстановка переменных.
Использование табличных функций.
Практические занятия
Использование запросов в блоках PL/pgSQL
Тема 3. Использование курсоров в PL/pgSQL
3.1 Введение в курсоры
Общие сведения о курсорах.
Объявление курсорных переменных.
Открытие курсора.
3.2 Работа с курсорами
Использование курсоров для обработки данных.
Операции с курсорами.
Обработка курсора в цикле
Практические занятия
Работа с курсорами
Тема 4. Динамическое построение запросов
4.1 Динамические запросы
Назначение и возможности динамических запросов.
Выполнение динамического запроса.
Конструкции динамических запросов
Практические занятия
Динамические запросы
Тема 5. Работа с массивами
5.1 Работа с массивами
Общие сведения о массивах.
Использование функций для обработки массивов.
Работа с массивами средствами PL/pgSQL.
Цикл по элементам массива
Практические занятия
Работа с массивами
Тема 6. Исключения: перехват ошибок
6.1 Сообщения и ошибки
Необходимость работы с исключениями.
Вывод сообщений и ошибок.
Перехват ошибок.
Журналирование ошибок.
Уровни обработки ошибок
Практические занятия
Работа с исключениями
Тема 7. Использование триггеров
7.1 Триггеры при изменении данных
Общие сведения о триггерах.
Функции-обработчики триггеров.
Динамическая компиляция пользовательских функций на языке PL/pgSQL | ДЖИДЖОЕВ
1. PostgreSQL official site. Available at: https://www.postgresql.org/, accessed: 20.10.2020.
2. Karthik Ramachandra, Kwanghyun Park, K. Venkatesh Emani, Alan Halverson, César A. Galindo-Legaria, Conor Cunningham Froid. Optimization of Imperative Programs in a Relational Database. Proceedings of the VLDB Endowment, vol. 11, no. 4, 2017, pp. 432-444.
3. Christian Duta, Denis Hirn, and Torsten Grust. Compiling PL/SQL Away. In Proc. of the 10th Annual Conference on Innovative Data Systems Research (CIDR’20), 2020, 8 p.
4. Denis Hirn and Torsten Grust. PL/SQL Without the PL. In Proc. of the 2020 ACM SIGMOD International Conference on Management of Data (SIGMOD’20), 2020, pp. 2677–2680.
5. PL/pgSQL – SQL Procedural Language. Available at: https://www.postgresql.org/docs/9.6/plpgsql-overview.html, accessed: 20.10.2020
6. The LLVM Compiler Infrastructure. Available at: http://llvm.org/, accessed: 20.10.2020.
7. Шарыгин Е.Ю., Бучацкий Р.А., Скворцов Л.В., Жуйков Р.А., Мельник Д.М. Динамическая компиляция выражений в SQL-запросах для СУБД PostgreSQL. Труды ИСП РАН, том 28, вып. 4, 2016 г., стр. 217-240. DOI: 10.15514/ISPRAS-2016-28(4)-13 / Sharygin E.Y., Buchatskiy R.A., Skvortsov L.V., Zhuykov R.A., Melnik D.M. Dynamic compilation of expressions in SQL queries for PostgreSQL. Trudy ISP RAN/Proc. ISP RAS, vol. 28, issue 4, 2016. pp. 217-240 (in Russian).
8. Бучацкий Р.А., Шарыгин Е.Ю., Скворцов Л.В., Жуйков Р.А., Мельник Д.М., Баев Р.В. Динамическая компиляция SQL-запросов для СУБД PostgreSQL. Труды ИСП РАН, том 28, вып. 6, 2016, стр. 37-48. DOI: 10.15514/ISPRAS-2016-28(6)-3 / Buchatskiy R.A., Sharygin E.Y., Skvortsov L.V., Zhuykov R.A., Melnik D. M., Baev R.V. Dynamic compilation of SQL queries for PostgreSQL. Trudy ISP RAN/Proc. ISP RAS, vol. 28, issue 6, 2016, pp. 37-48 (in Russian).
9. E. Sharygin, R. Buchatskiy, R. Zhuykov, and A. Sher. Runtime specialization of postgresql query executor. Lecture Notes in Computer Science, vol. 11, 2018, pp. 375–386.
10. Пантилимонов М.В., Бучацкий Р.А., Жуйков Р.А. Кэширование машинного кода в динамическом компиляторе SQL-запросов для СУБД PostgreSQL. Труды ИСП РАН, том 32, вып. 1, 2020, стр. 205-220. DOI: 10.15514/ISPRAS-2020-32(1)-11 / Pantilimonov M.V., Buchatskiy R.A., Zhuykov R.A. Machine code caching in PostgreSQL query JIT-compiler. Trudy ISP RAN/Proc. ISP RAS, vol. 32, issue 1, 2020. pp. 205-202 (in Russian).
11. ISP RAS website. Available at: https://www.ispras.ru/en/, accessed: 20.10.2020.
12. Graefe G. Volcano – an extensible and parallel query evaluation system. IEEE Transactions on Knowledge and Data Engineering, vol. 6, no. 1, 1994, pp. 120-135.
13. Perf profiler website. Available at: https://perf.wiki.kernel.org/index.php/Main_Page, accessed: 20.10.2020.
14. PostgreSQL SPI Memory Management. Available at: https://www.postgresql.org/docs/9.6/spi-memory.html, accessed: 20.10.2020.
15. PLV8 – A Procedural Language in Javascript powered by V8. Available at: https://github.com/plv8/plv8, accessed: 20.10.2020.
16. PL/Python – Python Procedural Language. Available at: https://www.postgresql.org/docs/9.6/plpython.html, accessed: 20.10.2020.
17. PL/Perl – Perl Procedural Language, Available at: https://www.postgresql.org/docs/9.6/plperl.html, accessed: 20.10.2020.
Глава 43. PL/pgSQL — процедурный язык SQL
10 ноября 2022 г.: Выпущены версии PostgreSQL 15.1, 14.6, 13.9, 12.13, 11.18 и 10.23!
Документация → PostgreSQL 15
Поддерживаемые версии: Текущий (15) / 14 / 13 / 12 / 11
Разрабатываемые версии: devel
Неподдерживаемые версии: 10 / 9,6 / 9,5 / 9.
Содержание
- 43.1. Обзор
- 43. 1.1. Преимущества использования PL/pgSQL
- 43.1.2. Поддерживаемые типы данных аргументов и результатов
- 43.2. Структура PL/pgSQL
- 43.3. Объявления
- 43.3.1. Объявление параметров функции
- 43.3.2.
Псевдоним
- 43.3.3. Типы копирования
- 43.3.4. Типы строк
- 43.3.5. Типы записей
- 43.3.6. Сопоставление переменных PL/pgSQL
- 43.4. Выражения
- 43.5. Основные положения
- 43.5.1. Назначение
- 43.5.2. Выполнение команд SQL
- 43.5.3. Выполнение команды с однострочным результатом
- 43.5.4. Выполнение динамических команд
- 43.5.5. Получение статуса результата
- 43.5.6. Ничего не делать вообще
- 43. 6. Конструкции управления
- 43.6.1. Возвращение с мероприятия
- 43.6.2. Возвращение с процедуры
- 43.6.3. Вызов процедуры
- 43.6.4. Условные обозначения
- 43.6.5. Простые петли
- 43.6.6. Перебор результатов запроса
- 43.6.7. Перебор массивов
- 43.6.8. Перехват ошибок
- 43.6.9. Получение информации о месте выполнения
- 43.7. Курсоры
- 43.7.1. Объявление переменных курсора
- 43.7.2. Курсоры открытия
- 43.7.3. Использование курсоров
- 43.7.4. Перебор результата курсора
- 43.8. Управление транзакциями
- 43.9. Ошибки и сообщения
- 43.9.1. Отчеты об ошибках и сообщениях
- 43. 9.2. Проверка утверждений
- 43.10. Триггерные функции
- 43.10.1. Триггеры при изменении данных
- 43.10.2. Триггеры событий
- 43.11. PL/pgSQL под капотом
- 43.11.1. Замена переменной
- 43.11.2. Кэширование плана
- 43.12. Советы по разработке на PL/pgSQL
- 43.12.1. Обработка кавычек
- 43.12.2. Дополнительные проверки во время компиляции и во время выполнения
- 43.13. Перенос с Oracle PL/SQL
- 43.13.1. Примеры портирования
- 43.13.2. Что еще стоит посмотреть для
- 43.13.3. Приложение
PostgreSQL: Документация: 15: 43.2. Структура PL/pgSQL
Функции, написанные на PL/pgSQL, определяются для сервера выполнением команд CREATE FUNCTION. Такая команда обычно выглядит, скажем, как
.
СОЗДАТЬ ФУНКЦИЮ somefunc(integer, text) ВОЗВРАЩАЕТ целое число
AS ' основной текст функции
'
ЯЗЫК plpgsql;
Тело функции представляет собой просто строковый литерал, если это касается CREATE FUNCTION
. Часто бывает полезно использовать долларовые кавычки (см. раздел 4.1.2.4) для написания тела функции, а не обычный синтаксис одинарных кавычек. Без долларовых кавычек любые одинарные кавычки или обратные косые черты в теле функции должны быть экранированы путем их удвоения. Почти во всех примерах в этой главе для тел функций используются литералы в долларовых кавычках.
PL/pgSQL — это язык с блочной структурой. Полный текст тела функции должен быть блок . Блок определяется как:
[ <<этикетка
>> ] [ ЗАЯВИТЬдекларации
] НАЧИНАТЬотчеты
КОНЕЦ [метка
];
Каждое объявление и каждый оператор в блоке завершается точкой с запятой. Блок, который появляется внутри другого блока, должен иметь точку с запятой после END
, как показано выше; однако последний END
, который завершает тело функции, не требует точки с запятой.
Совет
BEGIN
. Это неверно и приведет к синтаксической ошибке. Метка
необходима только в том случае, если вы хотите идентифицировать блок для использования в операторе EXIT
или уточнить имена переменных, объявленных в блоке. Если метка указана после END
, она должна совпадать с меткой в начале блока.
Все ключевые слова нечувствительны к регистру. Идентификаторы неявно преобразуются в нижний регистр, если они не заключены в двойные кавычки, как и в обычных командах SQL.
Комментарии в коде PL/pgSQL работают так же, как и в обычном SQL. Двойной тире ( --
) начинает комментарий, который продолжается до конца строки. /*
начинает комментарий к блоку, который распространяется на совпадающее вхождение */
. Блочные комментарии гнездятся.
Любой оператор в разделе операторов блока может быть подблоком . Подблоки можно использовать для логической группировки или для локализации переменных в небольшой группе операторов. Переменные, объявленные в подблоке, маскируют любые одноименные переменные внешних блоков на время действия подблока; но вы все равно можете получить доступ к внешним переменным, если вы уточните их имена с помощью метки их блока. Например:
СОЗДАТЬ ФУНКЦИЮ somefunc() ВОЗВРАЩАЕТ целое число КАК $$ << внешний блок >> ЗАЯВИТЬ целое число := 30; НАЧИНАТЬ ПОДНЯТЬ УВЕДОМЛЕНИЕ 'Количество здесь %', количество; -- Печатает 30 количество := 50; -- -- Создать подблок -- ЗАЯВИТЬ целое количество := 80; НАЧИНАТЬ ПОДНЯТЬ УВЕДОМЛЕНИЕ 'Количество здесь %', количество; -- Печатает 80 RAISE NOTICE 'Внешнее количество здесь %', externalblock.