Как удалить процедуру 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 :
И мы сможем управлять процедурой также и через визуальный интерфейс.
Выполнение процедуры
Для выполнения хранимой процедуры вызывается команда EXEC или EXECUTE :
EXEC ProductSummary
Удаление процедуры
Для удаления процедуры применяется команда 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 :
Стандарт позволяет удалять с помощью этой команды только одну процедуру.