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
.