Entfernen einer Prozedur oder Funktion aus einer Datenbank
Beim Entwickeln von Tools, die mit verschiedenen DBMS-Plattformen interagieren, können subtile Unterschiede in Syntax und Funktionsunterstützung eine Herausforderung darstellen. Ein solcher Fall ist, wie die Definitionen zum Entfernen gespeicherter Prozeduren gehandhabt werden, da sich SQL-Unterstützung und Konventionen zwischen den Systemen unterscheiden.
Dieser Artikel beleuchtet die Syntax und das Verhalten der DROP STORED PROCEDURE-Befehle in populären relationalen Datenbankverwaltungssystemen (RDBMS) und hilft Entwicklern dabei, zu verstehen, welche Anweisungen unterstützt werden und wie sie korrekt anzuwenden sind.
Im Artikel werden nur relationale DBMS berücksichtigt.
PostgreSQL
In PostgreSQL ist es möglich, zwei Arten von Funktionen zu erstellen: normale und Aggregatfunktionen. Prozeduren können seit Version 11, welche Ende 2018 veröffentlicht wurde, erstellt werden. Funktionen, einschließlich Aggregatfunktionen, sind bereits in früheren Versionen verfügbar.
Mithilfe einer DROP ROUTINE-Anweisung ist es möglich, jede Funktion oder Prozedur zu entfernen. Die Abfragesyntax:
DROP ROUTINE funktions_oder_prozedurname(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Beispiel:
DROP ROUTINE my_function(INTEGER, INTEGER)
Es kann Funktionen und Prozeduren mit demselben Namen geben, jedoch mit unterschiedlichen Argumenten. Das Erstellen einer Funktion mit demselben Namen nennt man Funktionsüberladung. Um Unklarheiten beim Entfernen von Prozeduren oder Funktionen zu vermeiden, müssen die Argumente spezifiziert werden. Falls die Funktion oder Prozedur nicht überladen ist, muss beim Entfernen keine Angabe der Argumenttypen erfolgen:
DROP ROUTINE funktions_oder_prozedurname
Es existieren separate Befehle, um Aggregatfunktionen, normale Funktionen und Prozeduren zu entfernen:
- DROP AGGREGATE
- DROP FUNCTION
- DROP PROCEDURE
Die Syntax dieser Befehle entspricht der von DROP ROUTINE.
Die Befehle DROP ROUTINE und DROP PROCEDURE wurden in Version 11 eingeführt. Die Befehle DROP AGGREGATE und DROP FUNCTION werden zum Entfernen von Funktionen in früheren Versionen verwendet.
ORACLE
Der folgende Befehl wird in Oracle verwendet, um Prozeduren zu entfernen:
DROP PROCEDURE prozedurname
Ein ähnlicher Befehl wird verwendet, um Funktionen zu entfernen:
DROP FUNCTION funktionsname
Beispiel:
DROP PROCEDURE my_procedure;
Funktionen und Prozeduren können eigenständig sein oder in einer Sammlung innerhalb eines Packages erstellt werden. Das Entfernen von Funktionen und Prozeduren aus dem Package ist nur möglich, indem das Package entfernt oder neu definiert wird.
Eigenständige Funktionen und Prozeduren können nicht überladen werden, daher ist es beim Entfernen nicht notwendig, die Argumenttypen anzugeben.
MySQL und MariaDB
Der folgende Befehl wird in MySQL und MariaDB verwendet, um Prozeduren zu entfernen:
DROP PROCEDURE prozedurname
Ein ähnlicher Befehl wird verwendet, um Funktionen zu entfernen:
DROP FUNCTION funktionsname
MySQL und MariaDB unterstützen keine Überladung von Prozeduren oder Funktionen; daher wird nur ein Name angegeben.
Seit Version 10.3.3 (23. Dezember 2017) ist es in MariaDB möglich, Aggregatfunktionen zu erstellen. Aggregatfunktionen werden wie normale Funktionen mittels des DROP FUNCTION-Befehls entfernt.
SQLite
SQLite unterstützt weder das Erstellen von Prozeduren noch von Funktionen, weshalb es keine Anweisung zu deren Entfernung gibt.
MS SQL Server
Die folgenden Befehle werden in MS SQL verwendet, um Prozeduren, normale Funktionen und Aggregatfunktionen zu entfernen:
DROP PROCEDURE prozedurname
DROP FUNCTION normal_funktionsname
DROP AGGREGATE aggregate_funktionsname
MS SQL unterstützt keine Überladung von Prozeduren und Funktionen; daher wird beim Entfernen lediglich der Name angegeben.
Im Gegensatz zu Prozeduren und normalen Funktionen beziehen sich Aggregatfunktionen in MS SQL ausschließlich auf eine externe Implementierung.
Netezza
Die folgenden Befehle werden in Netezza verwendet, um Prozeduren, normale Funktionen und Aggregatfunktionen zu entfernen:
DROP PROCEDURE prozedurname(argument_typen)
DROP FUNCTION normal_funktionsname(argument_typen)
DROP AGGREGATE aggregate_funktionsname(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Netezza unterstützt die Überladung von Funktionen und Prozeduren; daher sind die Argumenttypen notwendig. Im Gegensatz zu Prozeduren beziehen sich Funktionen in Netezza ausschließlich auf eine externe Implementierung.
Informix
Die folgenden Befehle werden in Informix verwendet, um Prozeduren, normale Funktionen und Aggregatfunktionen zu entfernen:
DROP PROCRDURE prozedurname(argument_typen)
DROP FUNCTION normal_funktionsname(argument_typen)
DROP AGGREGATE aggregate_funktionsname
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Für Aggregatfunktionen ist es nicht notwendig, die Argumenttypen anzugeben.
Es ist möglich, Prozeduren zu überladen; daher können mehrere Prozeduren denselben Namen besitzen. Um diese zu unterscheiden, ist es möglich, einer Prozedur beim Erstellen einen eindeutigen Namen zu geben. Das gilt auch für normale Funktionen. Ein eindeutiger Name kann zum Entfernen von Prozeduren und normalen Funktionen mit den folgenden Befehlen verwendet werden:
DROP SPECIFIC PROCEDURE eindeutiger_prozedurname
DROP SPECIFIC FUNCTION eindeutiger_normal_funktionsname
Wenn eine Prozedur oder normale Funktion nicht überladen ist, muss beim Entfernen keine Angabe der Argumenttypen erfolgen:
DROP PROCEDURE prozedurname
DROP FUNCTION normal_funktionsname
Der folgende Befehl ermöglicht das Entfernen einer Prozedur oder normalen Funktion:
DROP ROUTINE name(argument_typen)
oder, falls keine Überladung vorliegt:
DROP ROUTINE name
Dieser Befehl ist nützlich, wenn nicht bekannt ist, ob eine Prozedur oder Funktion entfernt werden soll.
Zudem kann ein eindeutiger Name zum Entfernen verwendet werden:
DROP SPECIFIC ROUTINE eindeutiger_name
IBM Db2
Die folgenden Befehle werden in IBM Db2 verwendet, um Prozeduren und Funktionen zu entfernen:
DROP PROCEDURE prozedurname(argument_typen)
DROP PROCEDURES funktionsname(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Prozeduren können überladen werden; somit können mehrere Prozeduren denselben Namen haben. Um diese zu definieren, ist es möglich, beim Erstellen einer Prozedur einen eindeutigen Wert zu setzen. Das gilt auch für Funktionen. Ein eindeutiger Name kann zum Entfernen von Prozeduren und Funktionen mittels der folgenden Befehle verwendet werden:
DROP SPECIFIC PROCEDURE eindeutiger_prozedurname
DROP SPECIFIC FUNCTION eindeutiger_funktionsname
Wenn eine Prozedur oder Funktion nicht überladen ist, ist es beim Entfernen nicht notwendig, die Argumenttypen anzugeben:
DROP PROCEDURE prozedurname
DROP FUNCTION funktionsname
AWS Athena
Athena unterstützt weder das Erstellen von Prozeduren noch von Funktionen; daher besteht keine Möglichkeit, diese zu entfernen.
Teradata
Die folgenden Befehle werden in Teradata verwendet, um Prozeduren und Funktionen zu entfernen:
DROP PROCEDURE prozedurname
DROP FUNCTION funktionsname(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Teradata unterstützt die Überladung von Funktionen (nicht jedoch von Prozeduren). In einer CREATE FUNCTION-Anweisung muss zusätzlich zum Funktionsnamen beim Überladen ein eindeutiger Name der Funktion angegeben werden. Mithilfe eines eindeutigen Namens ist es möglich, eine Funktion mit dem folgenden Befehl zu entfernen:
DROP SPECIFIC FUNCTION eindeutiger_funktionsname
Falls eine Funktion nicht überladen ist, kann beim Entfernen auf die Angabe der Argumenttypen verzichtet werden:
DROP FUNCTION funktionsname
Teradata unterstützt Makros, die in gewisser Weise Prozeduren ähneln. Der folgende Befehl wird verwendet, um Makros zu entfernen:
DROP MACRO makroname
Vertica
Vertica ermöglicht das Erstellen neuer Prozeduren (CREATE PROCEDURE-Befehl), die auf eine externe ausführbare Datei verweisen. Gespeicherte Prozeduren werden nicht unterstützt.
Der folgende Befehl wird verwendet, um Prozeduren zu entfernen:
DROP PROCEDURE prozedurname(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Prozeduren können überladen werden. Die Angabe der Argumenttypen ist notwendig, auch wenn die Prozedur nicht überladen ist.
Vertica unterstützt viele Funktionstypen:
- Aggregatfunktionen (CREATE AGGREGATE)
- Analytische Funktionen (CREATE ANALITIC FUNCTION)
- Load-Filter-Funktionen (CREATE FUNCTION)
- Load-Parser-Funktionen (CREATE PARSER)
- Load-Source-Funktionen (CREATE SOURCE)
- Transformationsfunktionen (CREATE TRANSFORM FUNCTION)
- Skalare Funktionen (CREATE FUNCTION)
- SQL-Funktionen (CREATE FUNCTION)
Es gibt Anweisungen in Klammern, die beim Erstellen von Funktionen helfen.
Alle Funktionen mit Ausnahme der SQL-Funktionen haben eine externe Implementierung, d.h. sie verweisen auf eine externe dynamische Bibliothek.
SQL-Funktionen werden in einer Datenbank gespeichert, können jedoch nur einfache Abfragen verwenden.
Für jeden Funktionstyp, außer für analytische Funktionen, existiert ein Befehl zum Entfernen der Funktionen.
DROP AGGREGATE FUNCTION name(argument_typen)
DROP FILTER name()
DROP SOURCE name()
DROP PARSER name()
DROP TRANSFORM FUNCTION name(argument_typen)
DROP FUNCTION name(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Jede Funktion kann mittels des DROP FUNCTION-Befehls entfernt werden, mit Ausnahme von Aggregat- und Transformationsfunktionen. Funktionen können überladen werden, daher ist es notwendig, die Argumenttypen anzugeben. Diese sind erforderlich, selbst wenn keine Überladung vorliegt.
SAP HANA
Die folgenden Befehle werden in SAP HANA verwendet, um Prozeduren und Funktionen zu entfernen:
DROP PROCEDURE prozedurname
DROP FUNCTION funktionsname
Da die Überladung von Funktionen und Prozeduren nicht unterstützt wird, genügt es, nur den Namen beim Entfernen anzugeben.
Apache Impala
Impala ermöglicht das Erstellen von Funktionen (skalare und aggregierte) mit einer externen Implementierung. Skalare Funktionen können in C++ und Java implementiert werden. Aggregatfunktionen nur in C++. Der folgende Befehl wird verwendet, um Aggregatfunktionen zu entfernen:
DROP AGGREGATE FUNCTION funktionsname(argument_typen)
wobei:
- argument_typen – Argumenttypen, getrennt durch ein Komma.
Der Befehl zum Entfernen einer skalaren Funktion hängt von der Sprachimplementierung ab.
Der folgende Befehl wird verwendet, um eine skalare Funktion in C++ zu entfernen:
DROP FUNCTION scalar_funktionsname(arguments_typen)
Der folgende Befehl wird verwendet, um eine skalare Funktion in Java zu entfernen:
DROP FUNCTION scalar_funktionsname
Impala ermöglicht die Überladung von Funktionen; daher ist es notwendig, beim Entfernen die Argumenttypen anzugeben. Java-Funktionen werden von Java selbst überladen, weshalb in diesem Fall die Argumente nicht angegeben werden müssen.
HPL/SQL bietet erweiterte Möglichkeiten für den Einsatz von Prozeduren und Funktionen.
Apache Hive
Hive ermöglicht es, Funktionen mit einer externen Implementierung in Java zu erstellen. Funktionen können temporär oder permanent sein. Temporäre Funktionen existieren nur in der aktuellen Sitzung.
Der folgende Befehl wird verwendet, um permanente Funktionen zu entfernen:
DROP FUNCTION funktionsname
Der folgende Befehl wird verwendet, um temporäre Funktionen zu entfernen:
DROP TEMPORARY FUNCTION funktionsname
Hive ermöglicht es, temporäre Makros zu erstellen, die einfache Ausdrücke enthalten können. Der folgende Befehl wird verwendet, um Makros zu entfernen:
DROP TEMPORARY MACRO makroname
HPL/SQL bietet erweiterte Möglichkeiten für den Einsatz von Prozeduren und Funktionen.
Verschiedene DBMS-Dokumentationen: