Как удалить процедуру sql
Перейти к содержимому

Как удалить процедуру sql

  • автор:

Как удалить процедуру sql

Для удаления процедуры в SQL необходимо использовать оператор DROP PROCEDURE .

Синтаксис оператора DROP PROCEDURE выглядит следующим образом:

DROP PROCEDURE procedure_name; 

Здесь procedure_name — это имя удаляемой процедуры.

Пример удаления процедуры:

DROP PROCEDURE get_customer_orders; 

Эта команда удаляет процедуру get_customer_orders .

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

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

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

Хранимые процедуры

Нередко операция с данными представляет набор инструкций, которые необходимо выполнить в определенной последовательности. Например, при добавлении данных покупки товара необходимо внести данные в таблицу заказов. Однако перед этим надо проверить, а есть ли покупаемый товар в наличии. Возможно, при этом понадобится проверить еще ряд дополнительных условий. То есть фактически процесс покупки товара охватывает несколько действий, которые должны выполняться в определенной последовательности. И в этом случае более оптимально будет инкапсулировать все эти действия в один объект — хранимую процедуру (stored procedure).

То есть по сути хранимые процедуры представляют набор инструкций, которые выполняются как единое целое. Тем самым хранимые процедуры позволяют упростить комплексные операции и вынести их в единый объект. Изменится процесс покупки товара, соответственно достаточно будет изменить код процедуры. То есть процедура также упрощает управление кодом.

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

И еще один важный аспект — производительность. Хранимые процедуры обычно выполняются быстрее, чем обычные SQL-инструкции. Все потому что код процедур компилируется один раз при первом ее запуске, а затем сохраняется в скомпилированной форме.

Для создания хранимой процедуры применяется команда CREATE PROCEDURE или CREATE PROC .

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

Например, пусть в базе данных есть таблица, которая хранит данные о товарах:

CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL );

Создадим хранимую процедуру для извлечения данных из этой таблицы:

USE productsdb; GO CREATE PROCEDURE ProductSummary AS SELECT ProductName AS Product, Manufacturer, Price FROM Products

Поскольку команда CREATE PROCEDURE должна вызываться в отдельном пакете, то после команды USE, которая устанавливает текущую базу данных, используется команда GO для определения нового пакета.

После имени процедуры должно идти ключевое слово AS.

Для отделения тела процедуры от остальной части скрипта код процедуры нередко помещается в блок BEGIN. END:

USE productsdb; GO CREATE PROCEDURE ProductSummary AS BEGIN SELECT ProductName AS Product, Manufacturer, Price FROM Products END;

После добавления процедуры мы ее можем увидеть в узле базы данных в SQL Server Management Studio в подузле Programmability -> Stored Procedures :

Создание хранимых процедур в MS SQL Server

И мы сможем управлять процедурой также и через визуальный интерфейс.

Выполнение процедуры

Для выполнения хранимой процедуры вызывается команда EXEC или EXECUTE :

EXEC ProductSummary

Выполнение хранимых процедур в MS SQL Server

Удаление процедуры

Для удаления процедуры применяется команда DROP PROCEDURE :

DROP PROCEDURE ProductSummary

Как удалить процедуру sql

DROP PROCEDURE — удалить процедуру

Синтаксис

DROP PROCEDURE [ IF EXISTS ] имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, . ] ] ) ] [, . ] [ CASCADE | RESTRICT ]

Описание

DROP PROCEDURE удаляет определение существующей процедуры. Пользователь, выполняющий эту команду, должен быть владельцем процедуры. Помимо имени процедуры требуется указать типы её аргументов, так как в базе данных могут существовать несколько процедур с одним именем, но с разными списками аргументов.

Параметры

Не считать ошибкой, если процедура не существует. В этом случае будет выдано замечание. имя

Имя существующей процедуры (возможно, дополненное схемой). Если список аргументов не указан, имя процедуры должно быть уникальным в её схеме. режим_аргумента

Режим аргумента: IN или VARIADIC . По умолчанию подразумевается IN . имя_аргумента

Имя аргумента. Заметьте, что на самом деле DROP PROCEDURE не обращает внимание на имена аргументов, так как для однозначной идентификации процедуры достаточно только типов аргументов. тип_аргумента

Тип данных аргументов процедуры (возможно, дополненный именем схемы), если таковые имеются. CASCADE

Автоматически удалять объекты, зависящие от данной процедуры, и, в свою очередь, все зависящие от них объекты (см. Раздел 5.13). RESTRICT

Отказать в удалении процедуры, если от неё зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

DROP PROCEDURE do_db_maintenance();

Совместимость

Эта команда соответствует стандарту SQL, но дополнена расширениями PostgreSQL :

Стандарт позволяет удалять с помощью этой команды только одну процедуру.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *