×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

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

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

5.1.6. Перегрузка функций

С одним и тем же именем типа данных name может быть определено несколько функций, если наборы принимаемых ими аргументов различаются. Иными словами, имена функций могут быть перегружены. Независимо от того, используется ли эта возможность, она требует соблюдения мер предосторожности при вызове функций в базах данных, где одни пользователи не доверяют другим; см. Раздел 2.7.3. При выполнении запроса сервер определяет, какую функцию следует вызвать, на основании типов данных и количества переданных аргументов. Перегрузка также может применяться для имитации функций с переменным числом аргументов, вплоть до определенного максимального количества.

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

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

не всегда очевидно, какая именно функция будет вызвана при вводе таких простых значений, как test(1, 1.5). Текущие правила разрешения имен описаны в Глава 2.7, однако не рекомендуется проектировать систему, которая неявно полагается на такое поведение.

Для функции, принимающей единственный аргумент составного типа, как правило, не следует выбирать имя, совпадающее с именем любого атрибута (поля) этого типа. Напомним, что атрибут(table) считается эквивалентным table.атрибут. В случае возникновения неоднозначности между функцией, работающей с составным типом, и атрибутом этого составного типа, приоритет всегда отдается атрибуту. Этот выбор можно переопределить, явно указав схему для имени функции (то есть, schema.func(table) ), однако во избежание подобных проблем лучше не выбирать конфликтующие имена.

Еще один возможный конфликт может возникнуть между функциями с ключевым словом VARIADIC и без него. Например, можно создать одновременно foo(numeric) и foo(VARIADIC numeric[]). В этом случае неясно, какая из функций должна быть выбрана при вызове с одним аргументом типа numeric, например foo(10.1). Согласно правилу, используется та функция, которая расположена раньше в пути поиска; если же обе функции находятся в одной схеме, то предпочтение отдается функции без ключевого слова VARIADIC.

При перегрузке функций на языке C действует дополнительное ограничение: имя каждой функции на языке C в семействе перегруженных функций должно отличаться от имен в коде C всех остальных функций, как внутренних, так и динамически загружаемых. При нарушении этого правила переносимость поведения не гарантируется. Это может привести к ошибке компоновщика на этапе выполнения или к вызову одной из функций (как правило, внутренней). Альтернативная форма ключевое слово AS предложения для команды CREATE FUNCTION позволяет отделить имя SQL-функции от имени функции в исходном коде на языке C. Например:

CREATE FUNCTION test(int) RETURNS int
    AS 'filename', 'test_1arg'
    LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
    AS 'filename', 'test_2arg'
    LANGUAGE C;

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

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению