CREATE PACKAGE — создать пакет
CREATE [ OR REPLACE ] PACKAGEимя_пакетаэлемент_пакета[ ... ]
CREATE PACKAGE создаёт новый пакет в текущей базе данных.
Пакет — это по сути схема, которая помогает организовать взаимосвязанные именованные объекты, поэтому его также можно создать командой CREATE SCHEMA, и с ним можно выполнять те же действия, что и с обычной схемой. Однако пакет может содержать только функции, процедуры и составные типы.
CREATE OR REPLACE PACKAGE либо создаст новый пакет, либо заменит существующее определение. Вы можете заменить существующий пакет, если он содержит только функции и типы, другие объекты должны быть предварительно удалены. Если при замене пакета не меняются сигнатуры содержащихся в нём функций, их содержимое заменяется, а зависимые объекты остаются. Если же сигнатура функции меняется, фактически создаётся отдельная функция. Новая функция будет создана успешно только при отсутствии объектов, зависящих от предыдущей, в противном случае CREATE OR REPLACE PACKAGE завершается ошибкой. То же ограничение действует при замене типов. При замене пакетов убедитесь, что никакие другие сеансы не используют их (другими словами, перед заменой пакетов остановите использующее их приложение).
имя_пакетаИмя создаваемого пакета. Имя пакета должно отличаться от имени любого существующего пакета или схемы в текущей базе данных. Имя не может начинаться с pg_, так как такие имена зарезервированы для системных схем.
элемент_пакетаОператор SQL, определяющий объект, который будет создан в пакете. В настоящее время внутри CREATE PACKAGE допускаются только операторы CREATE FUNCTION, CREATE TYPE и CREATE PROCEDURE. Подкоманды обрабатываются по существу так же, как и отдельные команды, выполняемые после создания пакета. Все переменные, объявленные в функции инициализации пакета, являются глобальными, поэтому к ним могут обращаться функции других пакетов, используя запись с точкой. Модификатор #import, указанный для функции инициализации, влияет на все функции пакета. Более подробно функции и модификаторы пакетов описаны в Разделе 44.11.
Чтобы создать пакет, пользователь должен быть суперпользователем или иметь право CREATE для текущей базы данных.
Создание пакета counter с функциями:
CREATE PACKAGE counter
CREATE FUNCTION __init__() RETURNS void AS $$ -- package initialization
DECLARE
n int := 1;
k int := 3;
BEGIN
FOR i IN 1..10 LOOP
n := n + n;
END LOOP;
END;
$$
CREATE FUNCTION inc() RETURNS int AS $$
BEGIN
n := n + 1;
RETURN n;
END;
$$
;Заметьте, что отдельные подкоманды не заканчиваются точкой с запятой, так же как в CREATE SCHEMA, и при создании функций не указывается язык.
Следующий пример показывает как можно использовать описанный выше пакет.
DO $$
#import counter
BEGIN
RAISE NOTICE '%', counter.n;
RAISE NOTICE '%', counter.inc();
END;
$$;
NOTICE: 1024
NOTICE: 1025Другой вариант предыдущего примера:
CREATE PACKAGE foo
CREATE TYPE footype AS (a int, b int)
CREATE FUNCTION __init__() RETURNS void AS $$
DECLARE
x int := 1;
BEGIN
RAISE NOTICE 'foo initialized';
END;
$$
CREATE FUNCTION get() RETURNS int AS $$
BEGIN
RETURN x;
END;
$$
CREATE FUNCTION inc() RETURNS void AS $$
BEGIN
x := x + 1;
ENG;
$$
;Ниже показано, как можно добиться того же результата командой CREATE SCHEMA:
CREATE SCHEMA foo; CREATE TYPE foo.footype AS (a int, b int); CREATE FUNCTION foo.__init__() RETURNS void AS $$ DECLARE x int := 1; BEGIN RAISE NOTICE 'foo initialized'; END; $$ LANGUAGE plpgsql; CREATE FUNCTION foo.get() RETURNS int AS $$ #package BEGIN RETURN x; END; $$ LANGUAGE plpgsql; CREATE FUNCTION foo.inc() RETURNS void AS $$ #package BEGIN x := x + 1; END; $$ LANGUAGE plpgsql;
Обратите внимание, что в этом случае вы должны использовать модификаторы #package.