Объявление PL / pgSQL

Введение

Все переменные должны быть объявлены в разделе объявлений блока (отмечены красным цветом).

Версия: 9.3

Синтаксис:

 [>] [DECLAREdeclarations] BEGINstatementsEND [label]; 

Примечание. Единственным исключением является то, что переменная цикла цикла FOR, повторяющегося по диапазону целочисленных значений, автоматически объявляется как целочисленная переменная.

Типы PL Переменные/pgSQL похожи на типы данных SQL, такие как integer, varchar и char.

Примеры:

 roll_no integer  ; qty numeric (5); description varchar; myrow tablename% ROWTYPE; myfield tablename.columnname% TYPE; arow RECORD; 

Вот общий синтаксис объявления переменной:

Синтаксис:

 name [CONSTANT] тип [COLLATE collation_name] [NOT NULL] [{DEFAULT |  : =} выражение]; 

Предложение DEFAULT, если оно задано, определяет начальное значение, присвоенное переменной при входе в блок. Если предложение DEFAULT не указано, переменная инициализируется нулевым значением SQL. Значение переменной по умолчанию оценивается и присваивается переменной каждый раз при входе в блок.

Примеры:

 qty integer DEFAULT 1; roll_no CONSTANT integer: = 10; url varchar: = 'http:// example.com '; 

Объявление параметров функции

Параметры, передаваемые функциям, имеют имена с идентификаторами $ 1, $ 2 и т. д. По желанию, псевдонимы могут быть объявлены для $ n имена параметров для повышения удобочитаемости. Предпочтительный способ — дать имя параметру в команде CREATE FUNCTION, например:

Code:

  CREATE FUNCTION sum_of_two_numbers (m  целое число, n целое) RETURNS целое AS $$ BEGIN RETURN m + n;  END; $$ LANGUAGE plpgsql;  

Вот еще один пример:

Код:

   CREATE FUNCTION FUN_TO_TEST () RETURNS двойной точности AS $ TEST $ BEGIN RETURN 4.295806896E-29;  КОНЕЦ;  $ TEST $ LANGUAGE PLPGSQL  

Вот та же функция, тело которой разделено одинарными кавычками:

Код:

  СОЗДАТЬ ФУНКЦИЮ FUN_TO_TEST () ВОЗВРАЩАЕТ двойную точность КАК НАЧАТЬ ВОЗВРАТ 4.295806896E-29;  КОНЕЦ;  'LANGUAGE PLPGSQL  

Вот еще один, который заставит вас понять, что использование апострофа в качестве разделителя тела — не лучшее решение:

Код:

  CREATE FUNCTION TODAY_IS () RETURNS CHAR (22) AS 'BEGIN RETURN' 'Today' '' 'is' '||  CAST (CURRENT_DATE AS CHAR (10));  КОНЕЦ;  'LANGUAGE PLPGSQL  

ALIAS

ALIAS используется для присвоения другого имени переменным с предопределенными именами, например NEW или OLD в процедуре триггера.. Вот синтаксис:

Код:

  newname АЛИС ДЛЯ oldname;  

Примеры:

Код:

  CREATE FUNCTION FUN_TO_TEST (dt DATE, ing INTEGER) ВОЗВРАЩАЕТ ДАТУ КАК $ test $  ОБЪЯВИТЬ ss НИКНЕЙМЫ ДЛЯ dt;  ff НИКНЕЙМЫ ДЛЯ ing;  НАЧАТЬ ВОЗВРАТ ss + ff * ИНТЕРВАЛ '2 ДНЯ';  КОНЕЦ;  $ test $ LANGUAGE PLPGSQL  

Вышеупомянутая функция возвращает дату, переданную как количество дней, добавленных к желаемому аргументу.

В следующем примере вы может использовать $ и позитрон переменной, переданной в аргументе, вместо нового имени переменной с псевдонимом.

Код:

  СОЗДАТЬ ФУНКЦИЮ FUN_TO_TEST (dt DATE, ing INTEGER) ВОЗВРАЩАЕТ ДАТУ КАК $ test $ DECLARE ss ALIAS FOR $ 1;  ff НИКНЕЙМЫ ДЛЯ 2 $;  НАЧАТЬ ВОЗВРАТ ss + ff * ИНТЕРВАЛ '2 ДНЯ';  КОНЕЦ;  $ test $ LANGUAGE PLPGSQL  

Типы переменных

% TYPE используется для получения типа данных переменной или столбца таблицы. В следующем примере roll_no — это столбец в таблице учеников. Чтобы объявить переменную с тем же типом данных, что и student.roll_no, вы должны написать:

Синтаксис :

 имя_переменной имя_таблицы. Имя_столбца  % TYPE 

Примеры:

Код:

  DECLAREroll_no student.  roll_no% TYPE;  

Вот еще один пример:

Код:

  СОЗДАТЬ ФУНКЦИЮ get_employee  (текст) ВОЗВРАЩАЕТ текст КАК 'ОБЪЯВИТЬ псевдонимы frst_name ДЛЯ $ 1;  lst_name employee.last_name% TYPE;  НАЧАТЬ ВЫБРАТЬ В lst_name last_name ОТ сотрудников ГДЕ first_name = frst_name;  вернуть frst_name ||  '' '' ||  lst_name;  КОНЕЦ;'  LANGUAGE 'plpgsql';  

Здесь, в приведенном выше примере, псевдоним был объявлен для аргумента функции, который должен быть именем сотрудника и переменной того же типа, что и поле last_name таблицы сотрудников.

Этот оператор извлекает из таблицы сотрудников фамилию сотрудника, имя которого совпадает с аргументом, полученным функцией, и вставляет его в переменную lst_name и возвращает имя и фамилия, разделенные пробелом.

Вот результаты использования функции get_employee ().

 postgres = # SELECT get_employee ('John  ');  get_first_name ---------------- Джон Чен (1 строка) 

Типы строк

Переменная составного типа называется переменной строки, которая может содержать целую строку результата запроса SELECT или FOR, если набор столбцов этого запроса соответствует объявленному типу переменной.

 name table_name% ROWTYPE; name композитный_тип_имя; 

Доступ к отдельным полям значения строки осуществляется с использованием обычной записи через точку, например rowvar.table_field. Поля типа строки наследуют размер поля таблицы или точность для таких типов данных, как char (n).. См. Следующий пример:

Код:

  CREATE FUNCTION get_employee (integer) ВОЗВРАЩАЕТ текст КАК 'DECLARE emp_id ALIAS FOR $ 1;  found_employee сотрудники% ROWTYPE;  НАЧАТЬ ВЫБРАТЬ В found_employee * ОТ сотрудников WHERE employee_id = emp_id;  ВОЗВРАТ found_employee.first_name ||  '' '' ||  found_employee.last_name;  КОНЕЦ;'  LANGUAGE 'plpgsql';  

PL/pgSQL выше показывает псевдоним для объявленного аргумента функции, который должен быть идентификатором сотрудника и переменной found_employee, которая использует структуру таблицы сотрудников. Строка извлекается с информацией о сотруднике, чей идентификационный номер совпадает с аргументом, полученным функцией.

Вот результаты использования функции get_employee ().

 postgres = # SELECT get_employee (108);  get_employee ----------------- Нэнси Гринберг (1 строка) 

Типы записей

Переменные записи аналогичны строке -типа, но у них нет предопределенной структуры. Они принимают фактическую структуру строки той строки, которую им назначают во время выполнения команды SELECT или FOR. Подструктура переменной записи может изменяться каждый раз, когда она назначается. RECORD — это не настоящий тип данных, а только заполнитель, когда функция PL/pgSQL объявляется для возврата типа записи, это не совсем то же самое понятие, что и переменная записи.

Синтаксис:

 name RECORD; 

Пример:

Код:

  СОЗДАТЬ ФУНКЦИЮ get_employee (целое число) ВОЗВРАЩАЕТ текст КАК 'DECLARE emp_id ALIAS FOR $ 1;  found_employee ЗАПИСЬ;  НАЧАТЬ ВЫБРАТЬ В found_employee * ОТ сотрудников WHERE employee_id = emp_id;  ВОЗВРАТ found_employee.first_name ||  '' '' ||  found_employee.last_name;  КОНЕЦ;'  LANGUAGE 'plpgsql';  

Сопоставление переменных PL/pgSQL

Когда функция PL/pgSQL имеет один или несколько параметров сортируемых типов данных, сопоставление определяется для каждого вызова функции в зависимости от сопоставлений, назначенных фактическим аргументам, как описано в Разделе 22.2. Если сопоставление успешно идентифицировано (т. Е. Нет конфликтов неявных сопоставлений между аргументами), то все параметры сопоставления обрабатываются как имеющие это сопоставление неявно. Это повлияет на поведение чувствительных к сопоставлению операций внутри функции.. Например, рассмотрим

Вот пример таблицы ‘jobs

 job_id |  job_title |  min_salary |  max_salary ------------ + --------------------------------- + -  ---------- + ------------ AD_PRES |  Президент |  20000 |  40000 AD_VP |  Вице-президент администрации |  15000 |  30000 AD_ASST |  Помощник администратора |  3000 |  6000 FI_MGR |  Финансовый менеджер |  8200 |  16000 FI_ACCOUNT |  Бухгалтер |  4200 |  9000 AC_MGR |  Менеджер по бухгалтерскому учету |  8200 |  16000 AC_ACCOUNT |  Общественный бухгалтер |  4200 |  9000 SA_MAN |  Менеджер по продажам |  10000 |  20000 SA_REP |  Торговый представитель |  6000 |  12000 PU_MAN |  Менеджер по закупкам |  8000 |  15000 PU_CLERK |  Клерк по закупкам |  2500 |  5500 ST_MAN |  Складской менеджер |  5500 |  8500 ST_CLERK |  Биржевой служащий |  2000 |  5000 SH_CLERK |  Клерк по доставке |  2500 |  5500 IT_PROG |  Программист |  4000 |  10000 МК_МАН |  Менеджер по маркетингу |  9000 |  15000 МК_РЕП |  Представитель по маркетингу |  4000 |  9000 HR_REP |  Представитель отдела кадров |  4000 |  9000 PR_REP |  Представитель по связям с общественностью |  4500 |  10500 

Вот пример

Код:

  СОЗДАТЬ ФУНКЦИЮ not_equal (макс. Десятичное, мин. Десятичное) ВОЗВРАТ  логическое AS $$ BEGIN RETURN maxa minb; END; $$ LANGUAGE plpgsql;  

Вот результаты использования функции not_equal ().

  postgres = # ВЫБРАТЬ not_equal (max_salary, min_salary) ИЗ вакансий;  not_equal ----------- ttttttttttttttttt (19 строк) 

Использование not_equal будет использовать обычное сопоставление maxa и minb для сравнения, а использование сопоставления C, которое не поддерживается в целочисленном типе данных. Кроме того, идентифицированное сопоставление также предполагается как сопоставление любых локальных переменных, которые имеют сопоставимые типы.

Вот еще один пример:

Код:

  СОЗДАТЬ ФУНКЦИЮ not_equal (текст fstnm, текст lstnm) ВОЗВРАТ  boolean AS $$ BEGIN RETURN fstnm lstnm; END; $$ LANGUAGE plpgsql;  

Теперь посмотрим, как используется сопоставление C.

 postgres = # ВЫБРАТЬ not_equal (first_name, last_name COLLATE "C") ОТ сотрудников;  not_equal ----------- t t t t t t t t t .... 

Вот еще один пример:

Код:

  СОЗДАТЬ ФУНКЦИЮ not_equal (fst_number integer, snd_number integer) ВОЗВРАТ  логическое AS $$ DECLARE fstnum integer: = fst_number;  sndname integer: = snd_number; BEGIN RETURN fstnum sndname; END; $$ LANGUAGE plpgsql;  

Теперь посмотрим на пример not_equal ()

 postgres =  # SELECT not_equal (15, 20); 

Если нет параметров сортируемых типов данных или для них не может быть идентифицировано общее сопоставление, тогда параметры и локальные переменные используют сопоставление своих данных по умолчанию тип (который обычно является сопоставлением базы данных по умолчанию, но может быть другим для переменных типов домена). Локальная переменная сортируемого типа данных может иметь другое сопоставление, связанное с ней, путем включения параметра COLLATE в ее объявление, например

Code:

  DECLARE local_a text COLLATE "en_US";  

Этот параметр отменяет сопоставление, которое в противном случае было бы задано переменной в соответствии с приведенными выше правилами. Кроме того, конечно, явные предложения COLLATE могут быть написаны внутри функции, если требуется принудительно использовать определенное сопоставление в конкретной операции. Например,

Код:

  CREATE FUNCTION get_employee (fstnm text, lstnm text) RETURNS boolean AS $$ BEGIN RETURN fstnm   

Теперь посмотрим на пример get_employee ()

 postgres = # SELECT get_employee (first_name, last_name COLLATE «C») ОТ сотрудников;  get_employee -------------- fffttff .. .. 

Далее:

  • Основные утверждения
  • Управляющие структуры

Оцените статью
nanomode.ru
Добавить комментарий