Шифрование и секретность в Linux


PL/pgSQL


PL/pgSQL
PL/pgSQL PL/pgSQL относится к семейству процедурных языков и обладает определенным сходством с процедурным языком Oracle, PL/SQL. Процедурным языком называется язык программирования, в...
Поддержка PL/pgSQL
Поддержка PL/pgSQL Поддержка языков программирования реализуется отдельным объектом базы данных. Таким образом, прежде чем использовать язык PL/pgSQL, необходимо включить его поддержку...
Включение поддержки PL/pgSQL при помощи psql
Включение поддержки PL/pgSQL при помощи psql Команда SQL CREATE LANGUAGE предназначена для включения поддержки процедурных языков в текущую базу данных. Тем не менее перед вызовом этой ком...
Листинг 11 1 Создание обработчика вызовов PL/pgSQL
Листинг 11.1. Создание обработчика вызовов PL/pgSQL booktown=# CREATE FUNCTION plpgsql_call_handler () booktown-# RETURNS OPAQUE booktown-# AS '/usr/local/pgsql/lib/plpgsql.so' boo...
Листинг 11 2 Включение поддержки
Листинг 11.2. Включение поддержки PL/pgSQL командой CREATE LANGUAGE booktown=# CREATE LANGUAGE 'plpgsql' HANDLER pipgsql_call_handler booktown-# LANCOMPILER 'PL/pgSQL'; CREATE З...
Включение поддержки PL/pgSQL приложением createlang
Включение поддержки PL/pgSQL приложением createlang Приложение createlang запускается в режиме командной строки. Если имя пользователя операционной системы, с которым вы зарегистрированы в...
Листинг 11 3 Использование приложения
Листинг 11.3. Использование приложения createlang суперпользователем базы данных $ cd /usr/local/pgsql/bin booktown=# createlang plpgsql booktown...
Листинг 11 4 Передача имени суперпользователя
Листинг 11.4. Передача имени суперпользователя при вызове createlang $ cd /usr/local/pgsql/bin $ createlang plpgsql -U manager booktown При успешном завершении программа createlang во...
Структура языка
Структура языка Язык PL/pgSQL имеет относительно простую структуру, что объясняется в основном тем, что каждый логически обособленный фрагмент кода существует в виде функции. Хотя на пе...
Блоки
Блоки Программы PL/pgSQL состоят из блоков. Такой метод организации программного кода обычно называется блочной структурой. Программные блоки вводятся в командах SQL CREATE FUNCTION, ко...
Листинг 11 5 Структура программного блока PL/pgSQL
Листинг 11.5. Структура программного блока PL/pgSQL CREATE FUNCTION идентификатор (аргументы) RETURNS тип AS ' DECLARE объявление: [...] BEGIN команда: [...] END: ' LANGU...
Комментарии
Комментарии В PL/pgSQL поддерживаются два вида комментариев, у которых имеются аналоги в других языках программирования: однострочные и блочные (многострочные) комментарии....
Синтаксис комментариев
Синтаксис комментариев Комментарии первого типа — однострочные комментарии — начинаются с двух дефисов (--) и не имеют специального завершителя. Модуль лексического разбоpa интерпретир...
Листинг 11 6 Однострочный комментарий
Листинг 11.6. Однострочный комментарий -- This will be interpreted as a single-line comment. Комментарии второго типа — блочные комментарии — знакомы каждому, кто когда-либо программиров...
Листинг 11 7 Блочный комментарий
Листинг 11.7. Блочный комментарий /* * This is a * block comment. */ Примечание 1Примечание 1 Хотя блочные комментарии могут содержать вложенные однострочные комментарии, вложен...
Хороший стиль комментирования
Хороший стиль комментирования Содержательные комментарии приносят пользу в любом языке программирования. Комментарий считается содержательным, если он помогает разъяснить, почему некот...
Команды и выражения
Команды и выражения Программы PL/pgSQL, как и в большинстве языков программирования, состоят из команд и выражений. Вероятно, вам довольно часто придется пользоваться выражениями, пото...
Команды
Команды Команда выполняет некоторое действие в коде PL/pgSQL — например, присваивает значение переменной или выполняет запрос. Последовательность команд в программных блоках PL/pgSQL о...
Выражения
Выражения Выражения представляют собой условную запись последовательности операций, результат которой принадлежит одному из базовых типов данных PostgreSQL. В листинге 11.8 приведена п...
Листинг 11 8 Использование выражений
Листинг 11.8. Использование выражений CREATE FUNCTION a_function () RETURNS int4 AS ' DECLARE an_integer 1nt4; BEGIN an_integer := 10 * 10: return an_integer; END: ' LANGUA...
Листинг 11 9 Результат вызова функции a_function()
Листинг 11.9. Результат вызова функции a_function() booktown=# SELECT a_function() AS output: output 100 (1 row) Если не считать динамических запросов (запросов SQL, выполняемых...
Листинг 11 10 Правильное использование временных меток
Листинг 11.10. Правильное использование временных меток CREATE FUNCTION add_shipment (integer, text) RETURNS timestamp AS ' DECLARE -- Объявление псевдонимов для аргументов функци...
Переменные
Переменные Переменные используются в программах PL/pgSQL для хранения изменяемых данных заранее определенного типа. Все переменные программного блока должны быть предварительно объявлен...
Типы данных
Типы данных Переменные PL/pgSQL могут относиться к любому из стандартных типов данных SQL (например, integer или char). Помимо типов данных SQL, в PL/pgSQL также предусмотрен дополните...
Объявление
Объявление Переменные, используемые в программном блоке PL/pgSQL, должны быть объявлены в секции объявлений этого блока, начинающейся с ключевого слова DECLARE в начале блока. Переменн...
Листинг 11 11 Объявление переменной PL/pgSQL
Листинг 11.11. Объявление переменной PL/pgSQL имя_переменной тип_данных [ := значение ]: Таким образом, объявление состоит из имени и типа переменной (следующих именно в этом порядке...
Листинг 11 12 Объявление переменных
Листинг 11.12. Объявление переменных CREATE FUNCTION identifier (arguments) RETURNS type AS ' DECLARE -- Объявить числовую переменную типа integer subjectjd integer: -- Объявить...
Листинг 11 13 Объявления переменных
Листинг 11.13. Объявления переменных CREATE FUNCTION example_function О RETURNS texi AS ' DECLARE -- Объявление целочисленной константы. -- инициализированной значением 5. five CONS...
Присваивание
Присваивание Присваивание в PL/pgSQL выполняется оператором присваивания (:=) в форме левдя_переменндя := правая_переменная Команда присваивает левой переменной значение правой переменн...
Листинг 11 14 Инициализация переменной
Листинг 11.14. Инициализация переменной CREATE FUNCTION идентификатор (аргументы) RETURNS тип AS ' DECLARE anjnteger int4 := 10: BEGIN команда: С...] END; ' LANGUAGE '...
Листинг 11 15 Использование команды SELECT INTO
Листинг 11.15. Использование команды SELECT INTO CREATE FUNCTION get_customer_id (text.text) RETURNS integer AS ' DECLARE -- Объявление псевдонимов для аргументов. Ijiame ALIAS...
Листинг 11 16 Вызов функции get_customer_id()
Листинг 11.16. Вызов функции get_customer_id() booktown=# SELECT get_customer_id{'Jackson','Annie'); get_customer_id 107 (1 row) Если требуется присвоить несколько значений неско...
Листинг 11 17 Использование команды
Листинг 11.17. Использование команды SELECT INTO с несколькими полями CREATE FUNCTION get_customer_name (integer) RETURNS text AS ' DECLARE -- Объявление псевдонимов для аргументо...
Листинг 11 18 Вызов функции get_customer_name()
Листинг 11.18. Вызов функции get_customer_name() booktown=# SELECT get_customer_name(107); get_customer_name Annie Jackson (1 row) Чтобы узнать, успешно ли были присвоены значени...
Листинг 11 19 Использование логической
Листинг 11.19. Использование логической переменной FOUND в функции get_customer_id() [...] SELECT INTO customerjd id FROM customers WHERE last_name = l_name AND firstjiame = f_name;...
Листинг 11 20 Вызов нового варианта
Листинг 11.20. Вызов нового варианта функции get_customer_id() booktown=# SELECT get_customer_id('Schmoe','Joe'); get_customer_id -1 (1 row)...
Аргументы
Аргументы При вызове функции PL/pgSQL могут получать аргументы различных типов. В аргументах пользователь передает исходные данные, необходимые для работы функции. Аргументы делают фун...
Листинг 11 21 Примеры вызовов функций
Листинг 11.21. Примеры вызовов функций booktown=# SELECT get_author('John'); get_author John Worsley (1 row) booktown=# SELECT get_author(1111); get_author Ariel Denham...
Листинг 11 22 Непосредственное
Листинг 11.22. Непосредственное использование аргументов в переменных CREATE FUNCTION double_price (float) RETURNS float AS ' DECLARE BEGIN -- Вернуть значение аргумента, умноженно...
Листинг 11 23 Синтаксис использования ключевого слова ALIAS
Листинг 11.23. Синтаксис использования ключевого слова ALIAS CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE идентификатор ALIAS FOR $1: идентификатор ALIAS FOR $2:...
Листинг 11 24 Псевдонимы PL/pgSQL
Листинг 11.24. Псевдонимы PL/pgSQL CREATE FUNCTION triple_pnce (float) RETURNS float AS ' DECLARE -- Переменная input_price объявляется как псевдоним -- для переменной аргумента, об...
Листинг 11 25 Результат вызова функции triple_price()
Листинг 11.25. Результат вызова функции triple_price() booktown=# SELECT triple_price(12.50); triple_price 37.5 (1 row)...
Возвращение переменных
Возвращение переменных Тип величины, возвращаемой функцией PL/pgSQL, должен соответствовать типу возвращаемого значения, указанному при создании функции командой CREATE FUNCTION. Значен...
Листинг 11 26 Синтаксис команды RETURN
Листинг 11.26. Синтаксис команды RETURN CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE объявление: [...] BEGIN команда: [...] RETURN { переменная \ значение...
Атрибуты
Атрибуты Для упрощения работы с объектами базы данных в PL/pgSQL существуют атрибуты переменных — ШРЕ и UROWTYPE. Атрибуты требуются для объявления переменной, тип которой совпадает с...
Атрибут %TYPE
Атрибут %TYPE Атрибут UTYPE используется при объявлении переменных с типом данных, совпадающих с типом некоторого объекта базы данных (чаще всего поля). Синтаксис объявления переменной...
Листинг 11 27 Объявление переменной с атрибутом %TYPE
Листинг 11.27. Объявление переменной с атрибутом %TYPE переменная таблица.лолеХТУРЕ В листинге 11.28 приведена функция, использующая атрибут ITYPE для хранения фамилии автора. В ней...
Листинг 11 28 Использование атрибута %TYPE
Листинг 11.28. Использование атрибута %TYPE CREATE FUNCTION get_author (text) RETURNS text AS ' DECLARE -- Объявление псевдонима для аргумента функции. -- в котором должно передава...
Листинг 11 29 Результат вызова функции get_author()
Листинг 11.29. Результат вызова функции get_author() booktown=# SELECT get_author('Andrew'); get_author Andrew Brook Ins (1 row)...
Атрибут %ROWTYPE
Атрибут %ROWTYPE Атрибут UROWTYPE используется в PL/pgSQL для переменной-записи, имеющей одинаковую структуру с записями заданной таблицы. Не путайте атрибут &ROWTYPE с типом данны...
Листинг 11 30 Использование атрибута %ROWTYPE
Листинг 11.30. Использование атрибута %ROWTYPE CREATE FUNCTION get_author (integer) RETURNS text AS ' DECLARE -- Объявление псевдонима для аргумента функции. -- в котором должен...
Листинг 11 31 Вызов новой версии функции get_author()
Листинг 11.31. Вызов новой версии функции get_author() booktown=# SELECT get_author(1212): get_author John Worsley (1 row)...
Конкатенация
Конкатенация Конкатенацией называется процесс построения новой строки посредством объединения двух (и более) строк. Конкатенация принадлежит к числу стандартных операций PostgreSQL и п...
Листинг 11 32 Возвращение результата конкатенации
Листинг 11.32. Возвращение результата конкатенации CREATE FUNCTION compound_word(text. text) RETURNS text AS ' DECLARE -- Объявление псевдонимов для аргументов функций. wordl A...
Листинг 11 33 Присваивание строковой
Листинг 11.33. Присваивание строковой переменной результата конкатенации CREATE FUNCTION title_and_author (text, text) RETURNS text AS ' DECLARE -- Объявление псевдонимов для двух...
Передача управления
Передача управления Команды передачи управления существуют практически во всех современных языках программирования, и PL/pgSQL не является исключением. С технической точки зрения сам вы...
Условные команды
Условные команды Условная команда указывает на то, что некоторое действие (или последовательность действий) выполняется в зависимости от результатов проверки заданного логического усло...
Команда IF/THEN
Команда IF/THEN Команда IF/THEN задает команду (или блок команд), выполняемых в случае истинности некоторого условия. Синтаксис команды IF/THEN показан в листинге 11.34....
Листинг 11 34 Синтаксис команды IF/THEN
Листинг 11.34. Синтаксис команды IF/THEN CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE объявления BEGIN IF условие THEN команда: [...] END IF; END; ' LAN...
Листинг 11 35 Использование команды IF/THEN
Листинг 11.35. Использование команды IF/THEN CREATE FUNCTION stock_amount (integer, integer) RETURNS integer AS ' DECLARE -- Объявление псевдонимов для аргументов функции. b_id...
Листинг 11 36 Результаты вызова функции stock_amount()
Листинг 11.36. Результаты вызова функции stock_amount() booktowrHf SELECT stock_amount(7808,1): stock amount 22 (1 row)...
Команда IF/THEN/ELSE
Команда IF/THEN/ELSE В команде IF/THEN/ELSE задаются два блока команд. Первый блок выполняется в том случае, если условие истинно, а второй — если оно ложно. Синтаксис команды IF/THEN/...
Листинг 11 37 Синтаксис команды IF/THEN/ELSE
Листинг 11.37. Синтаксис команды IF/THEN/ELSE CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE объявления BEGIN IF условие THEN команда: [...] ELSE кома...
Листинг 11 38 Команда IF/THEN/ELSE
Листинг 11.38. Команда IF/THEN/ELSE CREATE FUNCTION in_stock (integer.integer) RETURNS boolean AS ' DECLARE -- Объявление псевдонимов для аргументов функции. b_id ALIAS FOR $1:...
Листинг 11 39 Результат вызова функции in_stock()
Листинг 11.39. Результат вызова функции in_stock() booktown=# SELECT in_stock(4513,2); in stock t (1 row) Функция вернула значение TRUE — признак наличия книги на складе....
Команда IF/THEN/ELSE/IF
Команда IF/THEN/ELSE/IF Команда IF/THEN/ELSE/IF предназначена для последовательной проверки нескольких условий. Сначала проверяется первое условие; если оно окажется равным FALSE, пров...
Листинг 11 40 Команда IF/THEN/ELSE/IF
Листинг 11.40. Команда IF/THEN/ELSE/IF CREATE FUNCTION books_by_subject (text) RETURNS text AS ' DECLARE -- Объявление псевдонима для аргумента, содержащего либо -- строку...
Листинг 11 41 Результаты вызова функции books_by_subject()
Листинг 11.41. Результаты вызова функции books_by_subject() booktown=# SELECT books_by_subject('al1'); books_by_subject Arts: Dynamic Anatomy Business: Children's Books: T...
Циклы
Циклы Другую категорию команд, передающих управление внутри функций, составляют циклы. В циклах используются разные виды итераций, предназначенные для решения разных задач. Итеративные...
Безусловный цикл
Безусловный цикл Ключевое слово LOOP начинает простейший безусловный цикл. Команды безусловного цикла выполняются до тех пор, пока не будет достигнуто ключевое слово EXIT. За ключевым...
Листинг 11 42 Использование безусловного цикла
Листинг 11.42. Использование безусловного цикла CREATE FUNCTION square_integer_loop (integer) RETURNS integer AS ' DECLARE -- Объявление псевдонима для аргумента, numl ALIAS FO...
Листинг 11 43 Результат вызова функции square_integer_loop()
Листинг 11.43. Результат вызова функции square_integer_loop() booktown=# SELECT square_integer_loop(3); squa re_i nteger_l oop 6561 (1 row)...
Цикл WHILE
Цикл WHILE Цикл WHILE выполняет блок команд до тех пор, пока заданное условие не станет ложным. При каждой итерации цикла WHILE условие проверяется перед выполнением первой команды бло...
Листинг 11 44 Использование цикла WHILE
Листинг 11.44. Использование цикла WHILE CREATE FUNCTION add_two_loop (integer, integer) RETURNS integer AS ' DECLARE -- Объявление псевдонимов для аргументов. low_number ALIAS...
Цикл FOR
Цикл FOR Возможно, циклы FOR — самая важная разновидность циклов, реализованных в PL/ pgSQL. Цикл FOR выполняет программный блок для целых чисел из заданного интервала. У циклов FOR в...
Листинг 11 45 Пример использования цикла FOR
Листинг 11.45. Пример использования цикла FOR CREATE FUNCTION extract_all __titles2 () RETURNS text AS ' DECLARE -- Объявление переменной для кода темы. sub_id integer; --...
Листинг 11 46 Использование цикла FOR с атрибутом %ROWTYPE
Листинг 11.46. Использование цикла FOR с атрибутом %ROWTYPE CREATE FUNCTION extract_title (integer) RETURNS text AS ' DECLARE -- Объявление псевдонима для аргумента функции, su...
Листинг 11 47 Результат выполнения функции extract_title()
Листинг 11.47. Результат выполнения функции extract_title() booktown=# SELECT extract_title(2); extract_title Bartholomew and the Oobleck Franklin in the Dark Goodnight Moon...
Обработка ошибок и исключений
Обработка ошибок и исключений Команда RAISE предназначена для инициирования ошибок и исключений в функциях PL/pgSQL. Она передает заданную информацию механизму PostgreSQL elog (стандарт...
Таблица 11 1 Допустимые значения уровня ошибки
Таблица 11.1. Допустимые значения уровня ошибки Значение Описание DEBUG Команда уровня DEBUG направляет заданный текст в виде сообщения DE...
Листинг 11 48 Команда RAISE
Листинг 11.48. Команда RAISE CREATE FUNCTION raise_test () RETURNS integer AS ' DECLARE -- Объявление целочисленной переменной для тестового вывода. an_integer integer = 1; BEGIN...
Листинг 11 49 Результаты вызова raise_test()
Листинг 11.49. Результаты вызова raise_test() booktown=# SELECT raise_test(); NOTICE: Variable anjnteger was changed. NOTICE: Variable anjnteger's value is now 2. ERROR: Variable 2...
Вызов функций
Вызов функций При вызове функции PL/pgSQL из кода PL/pgSQL имя функции обычно включается в команду SQL SELECT или в команду присваивания. Примеры: SELECT функция (аргументы): перемен...
Листинг 11 50 Использование ключевого слова PERFORM
Листинг 11.50. Использование ключевого слова PERFORM CREATE FUNCTION shipjtem (text.text.text) RETURNS integer AS ' DECLARE -- Объявление псевдонимов для аргументов функции. l_...
PL/pgSQL и триггеры
PL/pgSQL и триггеры Определения триггеров PostgreSQL могут содержать ссылки на триггерные функции (то есть функции, которые должны вызываться при срабатывании триггера), написанные на я...
Листинг 11 51 Определение триггерной функции
Листинг 11.51. Определение триггерной функции CREATE FUNCTION функция () RETURNS opaque AS ' DECLARE объявления; [...] BEGIN команды; [...] END: ' LANGUAGE 'plpgsql'...
Таблица 11 2 Специальные переменные в триггерных функциях
Таблица 11.2. Специальные переменные в триггерных функциях Имя Тип данных Описание NEW RECORD Новая запись базы данных, создан...
Листинг 11 52 Триггерная функция check_shipment_addition()
Листинг 11.52. Триггерная функция check_shipment_addition() CREATE FUNCTION check_shipment_addition () RETURNS opaque AS ' DECLARE -- Объявление переменной для хранения кода покуп...
Листинг 11 53 Триггер check_shipment
Листинг 11.53. Триггер check_shipment booktown=# CREATE TRIGGER check_shipment booktown-* BEFORE INSERT OR UPDATE booktown-# ON shipments FOR EACH ROW booktown-* EXECUTE PROCEDURE chec...








Начало