Как удалить процедуру или функцию из базы данных

При разработке инструментов, которые взаимодействуют с разными СУБД, приходится учитывать много нюансов, потому что одни и теже вещи реализованы по-разному и стандарт 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.

Документация разных СУБД

Автор

Дмитрий Бравиков

Инженер. Электронщик. Программист.

Как удалить процедуру или функцию из базы данных: 2 комментария

  1. В PostgreSQL процедуры существовали с незапамятных времен. Как минимум в версии 7 в 2004 году они уже были. В версии 11 добавили транзакции внутри процедур.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.