CREATE PACKAGE

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.

См. также

DROP PACKAGE