кодесурса
«MySQL

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

script1adsense2code
script1adsense3code

Вступление

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

Версия: 9.3

Синтаксис:

 [<< ярлык >>]
[ОБЪЯВИТЬ
декларации]
НАЧАТЬ
заявления
END [метка];

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

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

Примеры:

 roll_no integer;
кол-во цифр (5);
описание varchar;
myrow tablename% ROWTYPE;
myfield tablename.columnname% TYPE;
arow RECORD;

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

Синтаксис:

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

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

Примеры:

 Кол-во целое число ПО УМОЛЧАНИЮ 1;
roll_no CONSTANT integer: = 10;
url varchar: = 'http: //example.com';

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

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

Код:

CREATE FUNCTION sum_of_two_numbers(m integer, n integer) 
RETURNS integer AS $$
        BEGIN
                RETURN m + n;
        END;
$$ LANGUAGE plpgsql;

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

Код:

CREATE FUNCTION FUN_TO_TEST () RETURNS double precision 
AS $TEST$ 
BEGIN 
   RETURN 4.295806896E-29; 
END;    
$TEST$  LANGUAGE PLPGSQL

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

Код:

CREATE FUNCTION FUN_TO_TEST () 
RETURNS double precision AS ' 
BEGIN 
RETURN 4.295806896E-29; 
END;    
'  
LANGUAGE PLPGSQL

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

Код:

CREATE FUNCTION TODAY_IS () RETURNS CHAR(22) AS  ' 
BEGIN 
  RETURN ''Today''''is '' || CAST(CURRENT_DATE AS CHAR(10)); 
END; 
' 
LANGUAGE PLPGSQL

ALIAS

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

Код:

newname ALIAS FOR oldname;

Примеры:

Код:

CREATE FUNCTION FUN_TO_TEST(dt DATE, ing INTEGER) 
RETURNS DATE AS $test$  
DECLARE ss     ALIAS FOR dt;  
        ff     ALIAS FOR ing; 
BEGIN  
   RETURN ss + ff * INTERVAL '2 DAY';  
END;  
$test$  
LANGUAGE PLPGSQL

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

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

Код:

CREATE FUNCTION FUN_TO_TEST(dt DATE, ing INTEGER) 
RETURNS DATE AS $test$  
DECLARE ss     ALIAS FOR $1;  
        ff     ALIAS FOR $2; 
BEGIN  
   RETURN ss + ff * INTERVAL '2 DAY';  
END;  
$test$  
LANGUAGE PLPGSQL

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

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

Синтаксис :

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

Примеры:

Код:

DECLARE
roll_no student.roll_no%TYPE;

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

Код:

CREATE FUNCTION get_employee(text) RETURNS text AS '
  DECLARE
     frst_name ALIAS FOR $1;
     lst_name employees.last_name%TYPE;
  BEGIN
     SELECT INTO lst_name last_name FROM employees 
	 WHERE first_name = frst_name;
     return frst_name || '' '' || lst_name;
  END;
' LANGUAGE 'plpgsql';

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

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

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

 postgres = # SELECT get_employee ('Джон');
 get_first_name
----------------
 Джон Чен
(1 ряд)

Типы строк

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

 имя table_name% ROWTYPE;
имя составное_тип_имя;

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

Код:

CREATE FUNCTION get_employee (integer) RETURNS text AS '
  DECLARE
    emp_id ALIAS FOR $1;
    found_employee employees%ROWTYPE;
  BEGIN
   SELECT INTO found_employee * FROM employees WHERE employee_id = emp_id;
    RETURN found_employee.first_name || '' '' || found_employee.last_name;
  END;
' LANGUAGE 'plpgsql';

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

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

 postgres = # SELECT get_employee (108);
  get_employee
-----------------
 Нэнси Гринберг
(1 ряд)

Типы записей

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

Синтаксис:

 имя ЗАПИСЬ;

Пример:

Код:

CREATE FUNCTION get_employee (integer) RETURNS text AS '
  DECLARE
    emp_id ALIAS FOR $1;
    found_employee RECORD;
  BEGIN
   SELECT INTO found_employee * FROM employees WHERE employee_id = emp_id;
    RETURN found_employee.first_name || '' '' || found_employee.last_name;
  END;
' LANGUAGE 'plpgsql';

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

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

Вот пример таблицы «Работа »

 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
 MK_MAN | Менеджер по маркетингу | 9000 | 15000
 MK_REP | Представитель по маркетингу | 4000 | 9000
 HR_REP | Представитель отдела кадров | 4000 | 9000
 PR_REP | Представитель по связям с общественностью | 4500 | 10500
 

Вот пример

Код:

CREATE FUNCTION not_equal(maxa decimal, minb decimal) 
RETURNS boolean AS $$
BEGIN
    RETURN maxa <> minb;
END;
$$ LANGUAGE plpgsql;

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

 postgres = # SELECT not_equal (max_salary, min_salary) FROM заданий;
 не равный
-----------
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
 T
(19 рядов)

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

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

Код:

CREATE FUNCTION not_equal(fstnm text, lstnm text) 
RETURNS boolean AS $$
BEGIN
    RETURN fstnm <> lstnm;
END;
$$ LANGUAGE plpgsql;

Теперь посмотрим на использование сортировки Си.

 postgres = # SELECT not_equal (имя, фамилия, имя COLLATE "C") 
ОТ сотрудников;
 не равный
-----------
 T
 T
 T
 T
 T
 T
 T
 T
 T
 ..
 ..

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

Код:

CREATE FUNCTION not_equal(fst_number integer, snd_number integer) 
RETURNS boolean 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 в ее объявление, например

Код:

DECLARE
    local_a text COLLATE "en_US";
	

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

Код:

CREATE FUNCTION get_employee(fstnm text, lstnm text) 
RETURNS boolean AS $$
BEGIN
    RETURN fstnm < lstnm COLLATE "C";
END;
$$ LANGUAGE plpgsql;

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

 postgres = # SELECT get_employee (имя, фамилия, имя COLLATE "C") 
ОТ сотрудников;
 get_employee
--------------
 е
 е
 е
 T
 T
 е
 е
 ..
 ..

Следующий:

Предыдущий: Введение в plpgSQL
Далее: Основные положения

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code