
При разработке инструментов, которые взаимодействуют с разными СУБД, приходится учитывать много нюансов, потому что одни и теже вещи реализованы по-разному и стандарт SQL поддерживается по-разному. Если рассмотреть достаточное количество СУБД, то окажется, что нет универсального способа удалить функцию или процедуру.
В статье рассматриваются только реляционные СУБД.
PostgreSQL
В PostgreSQL можно создавать два типа функций: обычные и агрегатные. Процедуры можно создавать начиная с 11 версии, выпущенной в конце 2018 года. Поддержка функций, в том числе и агрегатных, существует с ранних версий.
Удалить любую функцию или процедуру можно с помощью запроса DROP ROUTINE
. Синтаксис запроса следующий:
DROP ROUTINE имя_процедуры_или_функции(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Пример:
DROP ROUTINE my_function(INTEGER, INTEGER)
Могут существовать функции и процедуры с одинаковыми именами, но разными аргументами. Создание функций с одинаковым именами называется перегрузкой функций. Аргументы нужно указывать, чтобы устранить неоднозначность при удалении процедуры или функции. Если функция или процедура не имеет перегрузок, то при ее удалении можно не указывать типы аргументов:
DROP ROUTINE имя_процедуры_или_функции
Существуют отдельные запросы для удаления агрегатных функций, обычных функций и процедур соответственно:
Синтаксис этих запросов такой же как у DROP ROUTINE
.
Запросы DROP ROUTINE
и DROP PROCEDURE
появились вместе с процедурами в 11 версии. Для удаления функций в ранних версиях нужно использовать запросы DROP AGGREGATE
и DROP FUNCTION
.
В запросе DROP AGGREGATE
нужно обязательно указывать типы аргументов.
В запросе DROP FUNCTION
типы аргументов необязательны для не перегруженных функций, начиная с версии 10 (дата релиза: 2017-10-05).
Oracle
Для удаления процедур в Oracle используется следующий запрос:
DROP PROCEDURE имя_процедуры
Для удаления функций аналогичный запрос:
DROP FUNCTION имя_функции
Пример:
DROP PROCEDURE my_procedure;
Функции и процедуры могут быть самостоятельными, а могут быть объединены в коллекцию с помощью пакета. Удалить функции и процедуры из пакета можно только удалением или пересозданием пакета.
Самостоятельные функции и процедуры нельзя перегружать, поэтому при удалении не нужно указывать типы аргументов.
MySQL and MariaDB
Для удаления процедур в MySQL и MariaDB используется следующий запрос:
DROP PROCEDURE имя_процедуры
Для удаления функций аналогичный запрос:
DROP FUNCTION имя_функции
MySQL и MariaDB не поддерживают перегрузку процедур и функций, поэтому при удалении указывается только имя.
В MariaDB начиная с версии 10.3.3 (23 декабря 2017) можно создавать агрегатные функции. Агрегатные функции удаляются, как и обычные, запросом DROP FUNCTION
.
SQLite
SQLite не поддерживает создание процедур и функций, соответственно нет возможности их удалить.
MS SQL Server
В MS SQL Server для удаления процедур, обычных функций и агрегатных функций используются следующие запросы соответственно:
DROP PROCEDURE имя_процедуры
DROP FUNCTION имя_обычной_функции
DROP AGGREGATE имя_агрегатной_функции
MS SQL Server не поддерживает перегрузку процедур и функций, поэтому при удалении указывается только имя.
Агрегатные функции в MS SQL Server, в отличии от процедур и обычных функций, только лишь ссылаются на внешнюю реализацию.
Netezza
В Netezza для удаления процедур, обычных функций и агрегатных функций используются следующие запросы соответственно:
DROP PROCEDURE имя_процедуры(типы_аргументов)
DROP FUNCTION имя_обычной_фукнции(типы_аргументов)
DROP AGGREGATE имя_агрегатной_функции(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Типы аргументов нужны, так как Netezza поддерживает перегрузку процедур и функций. Типы аргументов обязательны даже если нет перегрузок. Если аргументов нет, то должны быть пустые скобки.
Пример создания и удаления процедуры в Netezza:
CREATE OR REPLACE PROCEDURE my_super_proc(INTEGER)
RETURNS INTEGER
LANGUAGE NZPLSQL AS BEGIN_PROC
BEGIN RETURN 1; END;
END_PROC;
DROP PROCEDURE my_super_proc; -- Fail
DROP PROCEDURE my_super_proc(INTEGER); -- OK
Функции (в том числе аггрегатные), в отличии от процедур, только лишь ссылаются на внешнюю реализацию.
Informix
В Informix для удаления процедур, обычных функций и агрегатных функций используются следующие запросы соответственно:
DROP PROCEDURE имя_процедуры(типы_аргументов)
DROP FUNCTION имя_обычной_функции(типы_аргументов)
DROP AGGREGATE имя_агрегатной_функции
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Типы аргументов не нужно указывать для агрегатных функций.
Процедуры можно перегружать, поэтому одно имя может быть у нескольких процедур. Чтобы их различать, можно, при создании процедуры, задать ей уникальное имя. То же справедливо для обычных функций. Уникальное имя можно использовать для удаления процедур и обычных функций с помощью следующих запросов:
DROP SPECIFIC PROCEDURE уникальное_имя_процедуры
DROP SPECIFIC FUNCTION уникальное_имя_обычной_функции
Если процедура или обычная функция не имеет перегрузок, то при их удалении можно не указывать типы аргументов:
DROP PROCEDURE имя_процедуры
DROP FUNCTION имя_обычной_функции
Следующий запрос позволяет удалить процедуру или обычную функцию:
DROP ROUTINE имя(типы_аргументов)
или в случае отсутствия перегрузок:
DROP ROUTINE имя
Такой запрос пригодится, когда неизвестно, что требуется удалить, процедуру или функцию.
Кроме того, для удаления можно использовать уникальное имя:
DROP SPECIFIC ROUTINE уникальное_имя
IBM Db2
В IBM Db2 для удаления процедур и функций используются следующие запросы соответственно:
DROP PROCEDURE имя_процедуры(типы_аргументов)
DROP FUNCTION имя_функции(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Процедуры можно перегружать, поэтому одно имя может быть у нескольких процедур. Чтобы их различать, можно, при создании процедуры, задать ей уникальное имя. То же справедливо для функций. Уникальное имя можно использовать для удаления процедур и функций с помощью следующих запросов:
DROP SPECIFIC PROCEDURE уникальное_имя_процедуры
DROP SPECIFIC FUNCTION уникальное_имя_функции
Если процедура или функция не имеет перегрузок, то при ее удалении можно не указывать типы аргументов:
DROP PROCEDURE имя_процедуры
DROP FUNCTION имя_функции
AWS Athena
Athena не поддерживает создание процедур и функций, соответственно нет возможности их удалить.
Teradata
В Teradata для удаления процедур и функций используются следующие запросы соответственно:
DROP PROCEDURE имя_процедуры
DROP FUNCTION имя_функции(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Teradata позволяет перегружать функции (но не процедуры). При перегрузке, в запросе CREATE FUNCTION, кроме имени функции, обязательно нужно указать уникальное имя функции. Функцию можно удалить, используя уникальное имя, с помощью следующего запроса:
DROP SPECIFIC FUNCTION уникальное_имя_функции
Если функция не имеет перегрузок, то при ее удалении можно не указывать типы аргументов:
DROP FUNCTION имя_функции
Teradata поддерживает макросы, которые чем-то похожи на процедуры. Для удаления макросов используется следующий запрос:
DROP MACRO имя_макроса
Vertica
Vertica позволяет создавать внешние процедуры (запрос CREATE PROCEDURE
), которые просто ссылаются на внешний исполняемый файл. Хранимые процедуры не поддреживается.
Для удаления процедур используется следующий запрос:
DROP PROCEDURE имя_процедуры(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Процедуры можно перегружать. Типы аргументов обязательны, даже если процедура не имеет перегрузок.
Vertica поддерживает большое количество типов функций:
- Агрегатные функции (
CREATE AGGREGATE
), - Аналитические функции (
CREATE ANALYTIC FUNCTION
), - Load filter functions (
CREATE FILTER
) - Load parser functions (
CREATE PARSER
) - Load source functions (
CREATE SOURCE
) - Функции трансформации (
CREATE TRANSFORM FUNCTION
) - Скалярные функции (
CREATE FUNCTION
) - SQL-функции (
CREATE FUNCTION
)
В скобках указаны запросы, с помощью которых создаются функции.
Все функции, кроме SQL-функций, имеют внешнюю реализацию, то есть ссылаются на внешнюю динамическую библиотеку.
SQL-функции хранятся в базе, но могут использовать только простые выражения.
Для каждого типа функций, кроме аналитических, есть соответсвующий запрос для удаления функций:
DROP AGGREGATE FUNCTION имя(типы_аргументов)
DROP FILTER имя()
DROP SOURCE имя()
DROP PARSER имя()
DROP TRANSFORM FUNCTION имя(типы_аргументов)
DROP FUNCTION имя(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Запросом DROP FUNCTION
можно удалить любую функцию, кроме агрегатной и функции трансформации. Функции можно перегружать, поэтому для удаления нужно указывать типы аргументов. Они обязательны даже если функция не имеет перегрузок.
SAP HANA
В SAP HANA для удаления процедур и функций используются следующие запросы соответственно:
DROP PROCEDURE имя_процедуры
DROP FUNCTION имя_функции
Перегрузка процедур и функций не поддерживается, поэтому при удалении указывается только имя.
Apache Impala
Impala позволяет создавать функции (скалярные и агрегатные) с внешней реализацией. Скалярные функции могут быть реализованы на языках C++ и Java. Агрегатные — только на C++.
Для удаления агрегатных функций используется следующий запрос:
DROP AGGREGATE FUNCTION имя_функции(типы_аргументов)
где:
типы_аргументов
— типы аргументов, перечисленные через запятую.
Запрос для удаления скалярной функции зависит от языка реализации.
Для удаления скалярных функций на C++ используется следующий запрос:
DROP FUNCTION имя_скалярной_функции(типы_аргументов)
Для удаления скалярных функций на Java используется следующий запрос:
DROP FUNCTION имя_скалярной_функции
Impala позволяет перегружать функции, поэтому при удалении нужно указывать типы аргументов. Функции на Java перегружаются средствами самой Java, поэтому аргументы не нужно указывать.
Более широкие возможности по использованию процедур и функций предоставляет HPL/SQL.
Apache Hive
Hive позволяет создавать функции с внешней реализаций на Java. Функции могут быть временными и постоянными. Временные функции существуют только в текущей сессии.
Для удаления постоянных функций используется следующий запрос:
DROP FUNCTION имя_функции
Для удаления временных функций используется следующий запрос:
DROP TEMPORARY FUNCTION имя_функции
Hive позволяет создавать временные макросы, которые могут содержать простые выражения. Для удаления макросов используется следующий запрос:
DROP TEMPORARY MACRO имя_макроса
Более широкие возможности по использованию процедур и функций предоставляет HPL/SQL.
В PostgreSQL процедуры существовали с незапамятных времен. Как минимум в версии 7 в 2004 году они уже были. В версии 11 добавили транзакции внутри процедур.
Сорри, перепутал с FUNCTION.