Stored Procedure
<< View | IBExpert | Debugger Collect Statistics Beispiel >>
Die deutschsprachige Dokumentation wird seit dem 26. Juli 2016 nicht mehr gepflegt. Aktuelle und vollständige Dokumentation finden Sie auf der englischsprachigen Webseite: IBExpert Documentation
Stored Procedure
Eine Stored Procedure (Prozedur) ist eine Serie von SQL-Befehlen (auch als Routinen bekannt), gespeichert als ein eigenständiges Programm in der Datenbank als Teil der Metadaten der Datenbank und kann von verschiedenen Client-Anwendungen aufgerufen werden. Eine Prozedur ist vorkompiliert, somit muss sie nicht durch das Netzwerk geschickt werden und jedes Mal geparst werden, sie wird einfach ausgeführt. Sie kann mit dem Befehl EXECUTE PROCEDURE
und der Festlegung des Prozedurnamens und einer Liste der Parameter gestartet werden. Prozeduren können die Daten von Parametern aufnehmen und - wie SELECT
s - deren Daten in Form einer Tabelle zurückgeben.
Prozeduren sind Triggern ähnlich, aber eine Prozedur wird nicht automatisch ausgeführt und ist nicht an eine bestimmte Tabelle gebunden.
Eine in Firebird/InterBase® geschriebenen Prozedur und Triggersprache, wird auch PSQL genannt. PSQL ist eine vollständige Programmiersprache für Stored Procedures und Trigger, die folgendes beinhaltet:
- SQL Datenmanipulationsanweisungen:
INSERT
,UPDATE
,DELETE
und EinzelSELECT
. - SQL Operatoren und Expressions, inklusive Generatoren und UDFs, die mit einer aufrufenden Anwendung verbunden sind.
- SQL Erweiterungen inklusive Aufgabenzuweisungen, Kontrollfluss-Anweisungen, Kontextvariablen (für Trigger), Event-Posting Anweisungen, Exceptions und Fehlerbehandlungsanweisungen.
- IBExpert unterstützt auch folgende Firebird 3 Klauseln:
OFFSET
andFETCH
.
Eine Summary of PSQL commands finden Sie im dem Kapitel Stored Procedure und Triggersprache. Die Programmausführung erfolgt auf dem Server.
Zurzeit beträgt die maximale Größe einer Stored Procedure oder eines Triggers in Firebird und InterBase® 48 KB BLR (die Größe der kompilierten Codesprache einer Stored Procedure oder eines Triggers und nicht der Quellcode selbst, der auch Kommentare enthalten könnte). Es ist jedoch ratsamer, da dies gut und gerne über 1.000 Zeilen Code umfasst, jede Prozedur dieser Größe in kleinere aufzuspalten, da das nicht nur die Lesbarkeit und die Instandhaltung verbessert, sondern vor allem die Effizienz.
Jede Stored Procedure ist ein einzeln stehendes Codemodul, dass interaktiv ausgeführt werden kann, oder als Teil einer SELECT
-Anweisung von einer anderen Stored Procedure aus oder von einer anderen Anwendungsumgebung.
Sie können direkt von Anwendungen oder können an die Stelle einer Tabelle oder eines Views in einer SELECT
-Anweisung gesetzt werden; sie können Eingabeparameter empfangen und Werte zur Anwendung zurückgeben.
Bei dem Client/Server-Datenbankkonzept ist es wichtig, dass die Datenbank nicht nur zur Speicherung von Daten verwendet wird, sondern auch aktiv involviert ist in die Datenabfrage und den Datenmanipulationsprozess. Da die Datenbank auch die Datenintegrität gewährleisten muss, ist es wichtig, dass die Datenbank auch komplexere Operationen, als nur einfache Vergleiche handhaben kann. Firebird/InterBase® verwenden Stored Procedures als Programmierumgebung zur Integration aktiver Prozesse in die Datenbank.
Die Stored-Procedure-Sprache ist eine Sprache, die erzeugt wurde, um in einer Datenbank zu laufen. Aus diesem Grund ist die Bandbreite beschränkt auf Datenbankoperationen und notwendige Funktionen.
Stored Procedures bieten SQL-Erweiterungen, die Variablen unterstützen, Kommentare, deklarative Anweisungen, konditionale Tests und Looping als Programmierelemente an. Sie haben alle vollen Zugriff auf SQL DML-Anweisungen, wodurch eine Vielzahl an Kommandotypen möglich sind; sie können jedoch nicht DDL-Anweisungen ausführen, d.h. eine Stored Procedure kann keine Tabelle erzeugen.
Stored Procedures bieten folgende Vorteile, wenn sie in einer Anwendung eingebunden sind:
- Reduzierung des Netzwerkdatenverkehrs durch das Off-Loading von Anwendungsprozessen vom Client zum Server. Die ist besonders wichtig für Remote-Benutzer, die langsamere Modemverbindungen nutzen. Aus diesem Grund sind sie natürlich schnell.
- Das Aufsplitten von komplexen Aufgaben in kleinere und logischere Module. Stored Procedures können sich gegenseitig aufrufen. Stored Procedures ermöglichen den Aufbau einer Bibliothek standardisierter Datenbank-Routinen, die auf verschiedene Weise aufgerufen werden können.
- Sie sind wieder verwendbar. Anstatt eine Anweisung immer wieder erneut zu erzeugen, wenn sie benötigt wird, ist es besser, eine Prozedur in einer Datenbank zu speichern. Sie können von vielen Anwendungen verwendet werden, die eine einzelne Datenbank nutzen. Änderungen in den darunter liegenden Datendefinitionen müssen nur in die Stored Procedure implementiert werden und nicht in die einzelnen Anwendungen selbst. Die Lesbarkeit wurde erweitert, die Wartungsintensität und die Dokumentation erheblich reduziert.
- Vollzugriff auf SQL und die Metadaten der Datenbank. Dies ermöglicht bestimmten Umgebungen erweiterte Operationen in der Datenbank durchzuführen, die aus einer anderen Anwendungssprache vielleicht nicht durchführbar wären. Die Sprache bietet sogar Funktionen, die nicht in SQL verfügbar sind, z.B.
IF…WHEN…ELSE
,DECLARE VARIABLE
,SUSPEND
, etc. - Erweiterte Sicherheit: wenn eine Datenbankoperation, wie https://ibexpert.net/ibe/index.php?n=Doc.DML-DataManipulationLanguage |
INSERT
,ALTER
oderDROP
]] nur in einer Tabelle von einer Stored Procedures durchgeführt werden kann, hat der Benutzer keine Rechte um direkt auf die Tabelle zuzugreifen. - Da Stored Procedures Teil von Firebird oder InterBase® sind, ist es irrelevant welches Front-End nachher genutzt wird, sei es Delphi, PHP oder andere.
Es gibt keine Nachteile bei der Verwendung von Stored Procedures. Es gibt jedoch zwei Einschränkungen. Erstens muss jede Information über Variablen in einer Tabelle platziert sein, auf die die Prozedur Zugriff hat. Zweitens die Prozeduren- und Triggersprache könnte zu begrenzt für komplexere Berechnungen sein. Stored Procedures sollten unter folgenden Umständen verwendet werden:
- Wenn eine Operation komplett auf dem Server ausgeführt werden kann ohne die Notwendigkeit, während der Operation Informationen vom Benutzer zu beziehen. Wenn eine Stored Procedure aufgerufen wird, können diese Eingabeparameter in die Stored Procedure eingebunden werden.
- Wenn eine Operation eine große Datenmenge verarbeiten muss, deren Transfer über das Netzwerk zur Client-Anwendung sehr viel Zeit in Anspruch nehmen würde.
- Wenn eine Operation periodisch oder regelmäßig durchgeführt werden muss.
- Wenn die Operation in gleicher Weise in vielen Prozessen durchgeführt wird, oder von Prozessen innerhalb der Anwendung oder von verschiedenen Anwendungen.
Die Stored Procedure muss alle, für die Datenbankverbindung notwendigen Anweisungen für die Erzeugung oder Änderung von Stored Procedures enthalten und schließlich für die Lösung der Datenbankverbindung.
Alle SQL-Skripte können in eine Stored Procedure und bis zu 10 SQLs in einer Prozedur eingebunden werden, sowie auch die zusätzlichen, bereits erwähnten Funktionen, die Prozeduren erheblich schneller und felxibler als SQL machen.
Stored Procedures können häufig als Alternative zu Views verwendet werden (da sie flexibler sind und mehr Kontrollmöglichkeiten bieten) da die ORDER BY
-Anweisung nicht in einem View verwendet werden kann (die Datensätze werden angezeigt, wie im Optimierer festgelegt, was nicht immer intelligent ist!). In solch einem Fall sollte eine Stored Procedure verwendet werden.
Stored Procedures sind fast identisch mit Triggern, die einzige Ausnahme ist die Art, wie sie aufgerufen werden: Trigger werden automatisch aufgerufen, wenn eine Änderung in einer Tabellenzeile vorgenommen wurde. Das meiste, was hier über Stored Procedures gesagt wurde, trifft auch auf Trigger zu.
Ausführung einer Stored Procedure
Firebird/InterBase® Stored Procedures sind in zwei Gruppen unterteilt im Hinblick auf die Art, wie sie aufgerufen werden. Select-Prozeduren geben Ergebniswerte in Form von Ausgabeparameter zurück, da sie anstelle eines Tabellennamens in einer SQL SELECT
-Anweisung verwendet werden können. Ausführungs- oder Nicht-Select-Anweisungen führen eine Aktion durch und geben keine Werte zurück. Um eine Prozedur aufrufen zu können, muss der Benutzer EXECUTE
-Rechte haben (siehe Rechtemanager). In IBExpert enthält das Template bereits die Anweisung (siehe die Abbildung im SET TERM
-Kapitel unten).
Der einfachste Weg, eine Stored Procedure auszuführen ist die EXECUTE PROCEDURE
-Anweisung. Diese Anweisung kann auf die folgenden Arten verwendet werden:
Wenn eine Prozedur aus einer Firebird/InterBase® Anwendung, wie einer anderen Prozedur oder einem Trigger heraus ausgeführt wird, hat dies folgende Syntax:
EXECUTE PROCEDURE <procedure_name> <input_parameter_list> RETURNING_VALUES <parameter_list>
Wenn die Prozedur Eingabevariablen benötigt, oder wenn Ausgabevariablen zurückgegeben werden sollen, müssen die relevanten Parameter festgelegt werden. In jedem Fall ist <parameter_list>
eine Liste von Parametern, getrennt durch Kommata (siehe Stored Procedure Parameter).
Jedes Mal, wenn eine Stored Procedure eine andere Prozedur aufruft, nennt man dies einen eingebetteten Aufruf, da dies im Kontext mit dem vorherigen und noch aktiven Aufruf der ersten Prozedur geschieht.
Stored Procedures können bis zu 1.000 Level tief eingebettet sein. Diese Einschränkung hilft, unbegrenzten Loops vorzubeugen, die dann eintreten, wenn eine rekursive Prozedur keine Begrenzungskonditionen hat. Eingebettete Aufrufe von Prozeduren können auch durch Speicher- und Stapelspeicherbegrenzung des Servers auf weniger als 1.000 Level eingeschränkt werden.
Wenn der IBExpert Prozedureneditor zur Ausführung von Prozeduren verwendet wird, sagt Ihnen IBExpert, ob Eingabeparameter eingegeben werden müssen:
bevor die Rückgabewerte auf der Seite Ergebnis angezeigt werden:
Select-Prozeduren
Es ist möglich, eine Stored Procedure an Stelle der Tabellenreferenz in einer SELECT
-Anweisung zu verwenden. Diese Art von Prozedur wird Select-Prozedur genannt.
Wenn eine Stored Procedure an Stelle einer Tabelle verwendet wird, sollte die Prozedur mehrere Spalten oder Zeilen zurückgeben, d.h. es werden Werte Ausgabeparametern zugeordnet und SUSPEND
verwendet, um diese Werte zurückzugeben. Dies ermöglicht der SELECT
-Anweisung die Ergebnisse weiter anhand verschiedener Kriterien zu filtern.
SUSPEND
wird verwendet, um die Ausführung der Prozdur auszusetzen und den Inhalt der Ausgabevariablen an die aufrufende Anweisung zurückzugeben. Wenn die Stored Procedure mehrere Zeilen zurückgibt, muss die SUSPEND
-Anweisung innerhalb einer FOR SELECT … DO
-Loop verwendet werden, um die Zeilen einzeln zurückzugeben.
Nicht-Select-Prozeduren
Ausführungs- oder Nicht-Select-Prozeduren führen eine Aktion aus und geben keinerlei Ergebnisse zurück.
Neue Prozedur
Es gibt zahlreiche Wege eine neue Stored Procedure zu erzeugen:
- Die Verwendung des IBExpert Menüpunktes Datenbank / Neue Prozedur oder die Verwendung des Symbols Neue Prozedur in der Symbolleiste Neues Datenbankobjekt, um den Prozedureneditor zu öffnen.
- Aus dem DB Explorer per Rechtsklick auf dem markierten Prozedurenzweig der entsprechenden Datenbankverbindung (oder Tastenkombination [Strg + N]), wodurch ebenfalls der Prozedureneditor gestartet wird.
- Eine Stored Procedure kann auch direkt aus einer ausgewählten Tabelle im DB Explorer erzeugt werden, indem man den Rechtsklickmenüpunkt Erzeuge SIUD Prozeduren wählt.
- Oder direkt aus dem Feldeditor erzeugt.
- Oder im IBExpert SQL Editor erzeugt und dann als Stored Procedure abgespeichert. Wenn ein SQL Skript erfolgreich committed wurde und die Ergebnisse, wie gewünscht sind, kann das Skript mit dem Schaltknopf Stored Procedure in eine Stored Procedure integriert werden. Das Stored-Procedure-Skript erscheint und muss nur noch benannt und abgeschlossen werden.
Die CREATE PROCEDURE
-Anweisung hat die folgende Syntax:
CREATE PROCEDURE <Procedure_Name> <Input_Parameter_List> RETURNS <Return_Parameter_List> AS <Local_Variable_Declarations> BEGIN <Procedure_Body> END
Die CREATE
und RETURNS
Anweisungen (wenn es eine Return-Anweisung gibt) sind im Stored-Procedure-Kopf enthalten. Alles nach dem AS
-Schlüsselwort ist der Prozedurenkörper. Es können auch Anweisungen zwischen den AS
- und BEGIN
-Schlüsselwörtern stehen, die auch zum Prozedurenkörper gehören. Diese Anweisungen deklarieren lokale Variablen als Stored Procedure und werden detailliert im Kapitel Stored-Procedure-Sprache beschrieben.
Folgende Firebird 2 Features werden unterstützt:
DECLARE <cursor_name> CURSOR FOR ...
OPEN <cursor_name>
FETCH <cursor_name> INTO ...
CLOSE <cursor_name>
LEAVE <label>
NEXT VALUE FOR <generator>
Es gibt darüber hinaus noch viele PSQL-Erweiterungen in Firebird 2.0. Weiteres finden Sie im Kapitel Firebird 2.0.4 Release Notes, Stored-Procedure-Sprache (PSQL). Es ist jetzt auch möglich SIUD Prozeduren zu erzeugen. Dies ist ein Mechanismus SIUD -Prozeduren-Texte zusammenzusetzen, basierend auf IBEBlock. Weiteres zu diesem Feature finden Sie unter Erzeuge Prozedur aus Tabelle.
Und seit Firebird 2.1 können Domänen in PSQL verwendet werden. Weitere Details und Beispiele finden Sie unter Domänen in Prozeduren verwenden.
Weitere Informationen, die die notwendigen Komponenten erklären, finden Sie unter Prozedureneditor, der mit den ersten beiden Menüoptionen gestartet werden kann (d.h. IBExpert Datenbankmenue und dem Rechtsklickmenü des DB Explorers.
Der Prozedureneditor hat seine eigene Symbolleiste (siehe Symbolleiste Prozedureneditor). Rechts in der Symbolleiste kann ein neuer Prozedurenname festgelegt werden. Der Prozedurenname unterliegt den Namensgebungsbedingungen für jedes Firebird/InterBase® Objekt und muss einmalig sein. Das Lazy Mode-Symbol kann zum Ein- und Ausschalten des Lazy Modes verwendet werden:
Der Editor Neue Prozedur hat fünf Seiten:
beschrieben unter Prozedureneditor. Eine neue Prozedur wird auf der Seite Prozedureneditor / Bearbeiten erzeugt.
SET TERM
Jeder Befehl in einem Firebird/InterBase® Skript muss mit einem Semikolon vom nächsten getrennt werden, inklusive der Prozedur selbst. Um zwischen dem Semikolon in der Prozedur und dem Semikolon als Endzeichen (Terminator) zu unterscheiden, wird ein anderer temporärer Trenner für das Ende der Prozedur benötigt. SET TERM
ersetzt das Semikolon als Endzeichen (Terminator) mit einem benutzerdefinierten Zeichen. Nachdem die Prozedur selbst mit diesem neuen Trenner beendet wurde, wird das Semikolon wieder als Trennsymbol eingesetzt.
Wenn der IBExpert Prozedureneditor verwendet wird, sind die Prozeduren-Templates bereits in diesem Code enthalten, sodass Sie sich darum nicht mehr zu kümmern brauchen. Wenn Sie den Editor Neue Prozedur öffnen und einen Blick auf die Seite DDL werfen, sehen Sie wie viel Code bereits von IBExpert erzeugt wurde, obwohl Sie noch nicht einmal begonnen haben, Ihre Prozedur zu definieren:
SUSPEND
und die GRANT EXECUTE
-Anweisung wurden ebenfalls eingebunden.
Wer die Syntax und ein Beispiel, wie dies zu verwenden ist, wenn von Hand codiert wird, sehen möchte, kann dies unter SET TERM
-Terminator.
Stored-Procedure-Parameter (Ein- und Ausgabe/ Rückgaben (Returns))
Eingabeparameter sind in der Variablenliste (=Werte) aufgelistet, die von der Client-Anwendung an die Prozedur gegeben wird. Diese Variabeln können zur Modifizierung des Verhaltens innerhalb einer Prozedur verwendet werden.
Die Liste der Rückgabeparameter (oder Ausgabeparameter) repräsentiert Werte, die die Prozedur an die Clientanwendung zurückgeben kann, Wie das Ergebnis einer Berechnung. Jede Liste hat folgendes Format:
ParameterName1 ParameterType, ParameterName2 ParameterType, ... ParameterNameN ParameterType
ParameterType
ist jeder gültige Firebird/InterBase® Datentyp außer Blob-, Domänen- und Array-Datentypen. Es ist auch möglich, Paramterwerte in dem Eingabeparameter-Formular zu kopieren und einzufügen.
Seit Firebird 2.0 ist es möglich Standardwerte für Stored Procedure Argumente anzubieten, die es dem Aufrufenden ermöglichen ein oder zwei Positionen am Ende der Argumenteliste wegzulassen. Wichtig: Wenn Sie einem Parameter einen Standardwert geben, müssen alle nachfolgenden Parameter auch Standardwerte bekommen. Weiteres finden Sie unter Firebird 2.0 Language Reference Update, Kapitel CREATE PROCEDURE
.
Seit Firebird 2.1 ist es möglich lokale Variabeln, sowie Eingabe- und Ausgabeargumente für Stored Procedures mit Hilfe von Domänen, anstelle von Datentypen zu deklarieren. In älteren Firebird Versionen ist es notwendig, den Datentyp von Domänen anstelle des Domänennamens zu schreiben. Weitere Details und Beispiele finden Sie unter Verwendung von Domänen in Prozeduren. Sortierungen können jetzt auch auf PSQL-Variablen und Argumente angewendet werden. Alle Firebird 2.1 Features können in den Firebird 2.1 Release Notes Kapitel, Procedural SQL (PSQL) nachgelesen werden.
Lokale Variablen / DECLARE VARIABLE
-Anweisung
Lokale Variablen können innerhalb des Prozedurenkörpers definiert werden. Lokale Variablen jedes Firebird/InterBase® Typs können innerhalb einer Stored Procedure deklariert werden. Wie in jeder anderen strukturierten Programmierumgebung, sind diese Variablen nur vorhanden, solange die Prozedur läuft und ihr Geltungsbereich beschränkt sich auf die Prozedur. Außerhalb der Prozedur sind sie unsichtbar und sie werden nach Beendigung der Prozedur gelöscht. Es gibt keine globalen Variablen in Stored Procedures oder Triggern. Wenn Werte von zwei oder mehreren Prozeduren verwendet werden müssen, sollten sie entweder als Parameter weitergegeben werden oder in einer Tabelle gespeichert werden.
Lokale Variablen werden sofort nach der AS
-Klausel mit der DECLARE VARIABLE
-Anweisung deklariert. Zum Beispiel wird die Variable ANY_SALES
in der Prozedur DELETE_EMPLOYEE
in der EMPLOYEE
-Datenbank wie folgt deklariert:
DECLARE VARIABLE ANY_SALES INTEGER;
Jede Variable muss in ihrer eigenen DECLARE VARIABLE
-Anweisung deklariert werden, da jede Anweisung nur eine Variable deklarieren kann.
Prozedurenkörper
Der Prozedurenkörper besteht aus einer zusammengesetzten Anweisung, die aus einer beliebigen Anzahl von Firebird/InterBase® Anweisungen in Prozeduren- und Trigger-Sprache bestehen kann. Der Prozedurenkörper beginnt mit einer BEGIN
-Anweisung, gefolgt von einer lokalen Variablen-Deklaration und endet mit einer END
-Anweisung.
BEGIN
und END
muss auch jeden Anweisungsblock einrahmen, der logisch zusammen gehört, wie die Anweisungen innerhalb eines Loops.
BEGIN
und END
brauchen, bis auf das abschließende END
in einer Prozedur, keine Endzeichen.
Prozedurenkörper kommentieren und entkommentieren
In bestimmten Situationen kann es notwendig sein, bestimmte Befehle oder SQL-Textteile zu deaktivieren. Dies kann einfach temporär geschehen, ohne diese Befehle löschen zu müssen.
Wählen Sie die betreffenden Zeilen im SQL Editor aus und wählen dann entweder das Symbol in der Symbolleiste des Editors:
den Rechtsklickmenüpunkt Kommentiere Ausgewähltes, oder die Tastenkombination [Strg + Alt + .]. Dies wandelt die Befehlszeilen in Kommentare um. Der kommentierte Text kann mit dem Symbol Prozedurentext entkommentieren, dem Rechtsklickmenüpunkt Entkommentiere Ausgewähltes oder der Tastenkombination [Strg+ Alt + ,] wieder als SQL Text eingesetzt werden. Dieses Feature kommentiert und entkommentiert auch DECLARE VARIABLE/CURSOR
-Abschnitte, um Abhängigkeiten von Objekten in einer DECLARE CURSOR
-Auswahl zu entfernen.
Es auch möglich das Schnellkommentar Feature in allen IBExpert Code-Editoren zu verwenden: Mit der Tastenkombination [Strg] + [Alt] + [.] (oder dem Rechtsklick-Menüpunkt Kommentiere Ausgewähltes), können Sie schnell die aktuelle Codeauswahl oder den ausgewählten Block kommentieren. Und verwenden Sie den Rechtsklick-Menüpunkt, Entkommentiere Ausgewähltes oder [Strg] + [Alt] + [,] zu unkommentieren.
Lazy Mode
Mit dem Lazy Mode muss der Programmierer sich keine Gedanken über die Ein- und Ausgabeparameter machen. Der Benutzer kann mit dem
Symbol im Prozedureneditor und Triggereditor zwischen Lazy Mode und Classic Mode hin- und herschalten .
Der Lazy Mode kann insgesamt abgeschaltet werden, indem die Standardvorgabe Editor Mode im IBExpert Menue Optionen unter Objekteditoren Optionen... / Prozedureneditor und Objekteditor Optionen... / Triggereditor von Lazy auf Standard umgestellt wird.
Es ist möglich, Domänen als Datentyp für Ein- und Ausgabeparameter und Variablen auszuwählen. In diesem Fall kopiert IBExpert Informationen aus der Domänendefinition in den ursprünglichen Datentyp des Parameters/ der Variable. Sie können auch eine Domäne per Drag 'n' Drop aus dem Datenbank Explorer ziehen.
Die SEGMENT SIZE
(Segmentgröße) kann auch für Blob-Parameter und Variablen festgelegt werden, wenn im Lazy Mode gearbeitet wird.
Prozedureneditor
Der Prozedureneditor kann mit dem Menüpunkt Datenbank/ Neue Prozedur gestartet werden, aus dem DB Explorer, mit dem Rechtsklickmenü oder per Doppelklick auf eine vorhandene Prozedur.
Unter Neue Prozedur finden Sie weitere Informationen, wenn Sie zum ersten Mal eine Stored Procedure erzeugen.
Der Prozedureneditor hat seine eigene Symbolleiste (siehe Symbolleiste Prozedureneditor) und bietet folgende Optionen an:
- Bearbeiten
- Ergebnis
- Beschreibung
- Abhängigkeiten
- Operationen
- Leistungsanalyse
- Plananalyse
- DDL
- Rechte
- Versionshistorie
- Vergleich
- To-Do
Zum Zeitpunkt des Schreibens ist die Größe einer Stored Procedure in Firebird und InterBase® auf 64K begrenzt.
Unterstützung externer Prozeduren (Firebird 3.0) wurde in IBExpert Version 2015.12.21 implementiert.
Bearbeiten
Die CREATE PROCEDURE
-Anweisung hat folgende Syntax:
CREATE PROCEDURE <Procedure_Name> <Input_Parameter_List> RETURNS <Return_Parameter_List> AS <Local_Variable_Declarations> BEGIN <Procedure_Body> END
Eine Stored Procedure umfasst folgende Komponenten:
- Eingabeparameter
- Ausgabeparameter (Rückgaben)
- Variablen
- Prozdurenkörper
- Kommentare (optional)
Wenn der Lazy Mode ausgeschaltet ist, bietet die Seite Bearbeiten ein einziges SQL Eingabefeld an, in dem die Prozedurensyntax bereits angezeigt wird. Wenn der Lazy Mode angeschaltet ist, besteht die Seite Bearbeiten aus drei Bereichen:
(1) Das Feldgitter, in dem die Parameter definiert werden können.
(2) In der Mitte sind drei Schaltknöpfe, um den Parametertyp festzulegen, z.B. Eingabeparameter, Ausgabeparameter und Variablen. Es ist möglich, per Drag 'n' Drop Parameter/Variablen vom Feldgitter auf die entsprechenden Schaltknöpfe zu ziehen. Klicken Sie beispielsweise auf den Schaltknopf Ausgabeparameter und ziehen Sie die benannte Variabel vom Feldgitter auf den Schaltknopf Variable. Klicken Sie auf den Schaltknopf Variablen, um die neue Variabel im Feldgitter anzusehen.
(3) Hier drunter befindet sich das SQL Eingabefeld zur direkten Codeeingabe. Auch hier wird die Prozedurensyntax bereits zur Hilfe des Benutzers angezeigt.
Wie in allen Editoren, ist es möglich, den Codetext, wie folgt zu formatieren:
- Kommentiere Ausgewähltes oder Entkommentiere Ausgewähltes mit dem Rechtsklickmenü
- einen markierten Codeblock einrücken mit [Strg + Umschltg + I] und zurück schieben mit [Strg + Umschltg + U]
Weitere Infos zu Tastaturkürzeln finden Sie unter Tastaturkürzel (Localizing Form).
Der Code Formatter wurde in der IBExpert Version 2009.03.25 eingeführt. Mit dem Code Formatter können Sie den Quellcode von Views, Triggern und Stored Procedures formatieren. Über den Menüpunkt Code formatting options ... können Sie ein Reihe von Einstellungen für alle oder für einzelne Anweisungen anpassen. Weiteres hierzu finden Sie im IBExpert Menue Optionen unter Code formatting options ....
Wer nicht das Template für die Syntax verwenden möchte oder wer bestimmte Anweisungen selbst hinzufügen möchte, um seinen eigenen Standard zu erstellen, kann dies mit dem IBExpert Menüpunkt Optionen / Hauptvorlagen und dem anschließenden Anklicken von Standard Mode oder Lazy Mode unter Neue Prozedur tun.
Die Anzeige der Prozeduren Codelänge kann ünter Optionen / Objekteditoreneinstellungen / Prozedureneditor mit der Prozeduren DDL-Größe immer anzeigen-Option deaktiviert werden.
Wie in allen SQL Eingabefenstern, kann das SQL Editor Menü per Rechtsklick aufgerufen werden.
Die Grundparameter der Stored Procedure werden hier als SQL Text zur Erzeugung der Prozedur gesetzt. Ein Parameter kann jeden Firebird/InterBase® Datentyp haben, außer Blob oder Array. Die Eingabeparameter werden nach dem Prozedurennamen in Klammern gesetzt, die Ausgabeparameter werden nach der RETURNS
-Anweisung in Klammern gesetzt und der, in der InterBase® Prozeduren- und Trigger-Sprache geschriebene, Prozedurenkörper wird mit den Anweisungen BEGIN
und END
eingeklammert.
Neue Parameter können einfach und schnell durch Anklicken des entsprechenden Schaltknopfes (z.B. Eingabe, Ausgabe oder Variablen) und Eingabe der Feld-Information mit dem entsprechenden Symbol oder dem Rechstklickmenü auf dieselbe Weise, wie eine neue Tabelle definiert werden.
Lokale Variabeln jedes Firebird/InterBase® Typs können innerhalb einer Stored Procedure deklariert werden (weitere Infos unter ''Lokale Variablen), nach dem Schlüsselwort AS
und vor BEGIN
(welches den Anfang eines Prozedurenkörpers markiert).
Alternativ kann die benötigte Information direkt in das Eingabefeld des Editors eingegeben werden und die Feldnamen können einfach per Drag 'n' Drop aus dem DB Explorer oder dem SQL Assistenten in das Prozedurenskript gezogen werden. Die Option Code Insight kann genutzt werden, um zeitsparend nach den korrekten Namen zu suchen und um etwaigen Tippfehlern vorzubeugen. Per Rechtsklick in diesem Bereich wird ein SQL Editor Menü aufgerufen.
Die Eingabeparameter werden mit Ihren Typen nach dem Prozedurennamen in Klammern gesetzt. Durch Aktivierung der Option Code Parameter Optionen / Editoreinstellungen / Code Insight, erscheint automatisch eine Liste der notwendigen Parameter. Ausgabeparameter werden auf dieselbe Weise nach RETURNS
definiert. Die Operationen, die von der Prozedur durchgeführt werden, werden nach der BEGIN
-Anweisung beschrieben. Weitere Information finden Sie unter Stored-Procedure-und Trigger-Sprache.
Nach Eingabe der benötigten Information, kann die Stored Procedure mit [F9] oder dem entsprechenden Symbol ausgeführt werden. Das Anweisungsfenster erscheint, wo die Ergebnis-SQL-Anweisungen vor der Kommentierung eingesehen werden können. Wenn nötig, kann der Code nachträglich mit dem entsprechenden Symbol oder [Umschltg + Strg + D] debugged werden. (Mehr Infos unter Debug von Prozeduren.)
Vergessen Sie nicht abschließend die neue Prozedur mit dem entsprechenden Symbol in der Symbolleiste oder [F9] zu kompilieren und, wenn gewünscht, automatisch die Rechte zuzuweisen, wiederum mit dem entsprechenden Symbol in der Symbolleiste oder dem Tatstaturkürzel [Strg + F8].
Ergebnis
Die Seite Ergebnis erscheint nach Ausführung der Prozedur und zeigt alle geholten Datensätze an:
Details finden Sie unter SQL Editor / Ergebnis.
Beschreibung
Weitere Infos hierzu finden Sie unter Tabelleneditor / Beschreibung.
Abhängigkeiten
Siehe Tabelleneditor / Abhängigkeiten.
Operationen
Auf dieser Seite wird die Prozedur in einzelne Opertionen aufgegliedert und untersucht, ob sie einen Plan (z.B. index) verwenden oder nicht. Die Prozedur ALL_LANGS
in der Beispieldatenbank EMPLOYEE
weist rote Einträge auf, die auf den Plan NATURAL
hinweisen (z.B. werden keine Indizes verwendet). Wenn eine Operation ausgwählt wird, wird die Anweisung für diese Operation im unteren Fenster angezeigt:
Per Doppelklick auf die ausgewählte Operation, erscheint das SQL Eingabefeld mit markierter SQL-Anweisung für diese Operation, wo weitere Analysen und Anpassungen möglich sind. Soll zum Beispiel vielleicht die Anweisung ORDER BY
geändert werden, oder vielleicht ein anderer JOIN
?
Eingabe- und Ausgabeparameter und Variablenfelder können durch Anklicken der Schaltknöpfe in der Mitte des Editors angezeigt werden. Änderungen können direkt im SQL Fenster werden und nachträglich ausgeführt und committed werden.
Leistungsanalyse
Diese Seite erscheint nur, wenn eine Prozedur ausgeführt wurde. Weitere Infos hierzu finden Sie unter SQL Editor / Leistungsanalyse.
Plananalyse
Weiteres finden Sie unter SQL Editor / Plananalyse.
DDL
Die Seite DDL enthält die Anweisung CREATE PROCEDURE
, die Beschreibung der Stored Procedure und der Parameter und die Anweisung GRANT
.
Rechte
Weitere Infos unter Tabelleneditor / Rechte und automatische Rechtezuweisung.
Versionshistorie
Weitere Infos unter View / Versionshistorie.
Vergleich
Weitere Infos unter Tabelleneditor / Vergleich.
To-Do
Weiteres unter Tabelleneditor / To-Do.
Debug von Prozeduren und Triggern (IBExpert Debugger)
Eine Stored Procedure oder ein Trigger kann einfach und schnell in IBExpert (diese Feature ist leider nicht in der kostenlose IBExpert Personal Edition enthalten) mit dem Debug Procedure-Symbol oder [F8] debugged werden:
IBExpert vollzieht die Prozedur oder den Trigger auf dem Datenbankserver durch Interpretation der Prozedur und einzelnes Ausführen der Befehle. Es werden viele nützliche Funktionen angeboten, wie breakpoints, step into, trace oder run to cursor. Sie können bestimmte Parameter ansehen, die Leistung und die verwendeten Indizes ananlysieren und sogar währenddessen Werte ändern. Wenn Sie erfahren im Umgang mit Delphi sind, können Sie leicht den Debugger umgehen, da die Tastaturkürzel, etc. dieselben sind.
Übrigens: wenn Sie Probleme beim Anrufen oder Öffnen einer Prozedur von IBExpert aus haben, weisen wir auf die IBExpert FAQ Seite hin. Hier finden Sie eine Reihe von Tipps, die in der Regel den Großteil aller Probleme löst.
Eine besonders interessante neue Funktion in IBExpert Version 2014.01.01 ist die unten beschriebene Collect Statistics-Modus. Ein Beispiel hierfür mit den IBExpert Demo DB1 Prozeduren INITALL
und DELETEALL
finden Sie hier.
IBExpert unterstützt auch Firebird 3.0 Scroll Cursors in Prozedur-/Trigger-Editoren und Debuggern. Öffnen Sie die Prozedur oder den Trigger im Prozedureneditor oder Triggereditor durch Doppelklicken auf den Prozeduren/Triggernamen im DB Explorer und klicken Sie auf das Symbol Debug in der Prozedur oder der Symbolleiste des Triggereditors (oder [Umschaltg + Strg + D]), um das Fenster Debugger zu öffnen.
Der Debug-Prozeduren/Triggereditor umfasst 3 Seiten, die Seite Debug (hier beschrieben), Leistungsanalyse und der SQL Editor.
Seit IBExpert Version 2009.08.17 werden die Debugging-Optionen Careful (vorsichtig) und Fast (schnell) angeboten. Im Defaultmodus, Careful, wird eine entsprechende SELECT
-Anweisung auf dem Server erstellt und ausgeführt. Der Fast-Modus führt bestimmte Anweisungen, wie zum Beispiel einfache Aufgaben und Boolean-Ausdrücke von IF/WHILE
-Anweisungen, wenn möglich auf der Clientseite aus. Der Fast-Modus soll genutzt werden, wenn zum Beispiel, Sie wiederholt eine Schleife mit Anweisungen ausführen möchten, die auf der Clientseite kalkuliert werden können; so wird die Ausführungszeit erheblich gekürzt. Sie können den bevorzugten Modus oben rechts auswählen, bevor Sie mit dem Debug-Vorgang beginnen.
In der oberen Hälfte dieses Dialogs wird der SQL Text angezeigt. Der Objektname (falls zutreffend) wird in der Fensterleiste angezeigt. In dem unteren Bereich wird die Anzahl der Seiten angezeigt:
Parameter und Variablen
Die Parameter werden in einer Tabelle aufgelistet. Die kreisrunden Symbole links vom Namen, zeigen an, ob die Parameter Eingabe-(I
) oder Ausgabeparameter (O
) sind. Variablen haben logischerweise den Schlüssel (V
). Weitere, hier angezeigte Informationen beinhalten den Parameterwert, Geltungsbereich und Datentyp. Die Watch-Boxen können aktiviert werden, um festzulegen, welche Variablen beobachtet werden sollen.
Der Inhalt der Variablen kann in der Spalte Wert eingesehen werden, oder direkt durch Halten des Mauszeigers auf den Variablennamen im Code selbst.
Es ist möglich, Parameter/Variablen mit den Werten jedes Datengitters zu initialisieren. Ziehen Sie einen Zellwert einfach per Drag 'n' Drop von aus einem Datengitter in die entsprechende Verknüpfung in der Parameter/Variablenliste, um die Variable mit mit dem Wert der Datenzelle zu initialisieren. Es ist auch möglich, mehrere Variablen/Parameter zu initialisieren, durch Halten der Taste [Strg] beim Loslassen nach dem Ziehen des Wertes aus dem Datengitter. In dem Fall sucht IBExpert die entsprechenden Parameter/Variablen (anhand des Namens) für jedes Feld in dem Datensatz und wenn der/die Parameter/Variable gefunden wurde, wird er/sie mit dem Wert des gleichnamigen Feldes initialisiert.
Universaltrigger, die Kontextvariablen INSERTING
/UPDATING
/DELETING
verwenden können hier ebenfalls debugged werden. Der Debugger interpretiert diese Variablen als reguläre Eingabeparameter mit einem BOOLEAN
-Datentyp und diese sind standardmäßig FALSE
.
Watches
Die Seite Watches zeigt die Parameter und Variablen an, die auf der vorherigen Seite zur Beobachtung markiert wurden.
Letzte Anweisung
Nach der Ausführung wird die letzte interne Anweisung hier, zusammen mit zusätzlichen Informationen, wie der Ausführungszeit, angezeigt:
Breakpoints
Diese Seite zeigt die Positionen an, an denen Breakspoints mit dem entsprechenden Symbol in der Debug Prozedur Symbolleiste, der Taste [F5] oder durch Anklicken der blauen Punkte im linken Rand des SQL-Fensters definiert wurden.
Wenn die Prozedur ausgeführt wird (mit dem entsprechenden Symbol oder [F9]), wird immer automatisch an diesen Breakpoints angehalten. Die Prozedur kann somit Schritt für Schritt, entweder mit [F8] (oder dem entsprechenden Symbol in der Symbolleiste) ausgeführt werden, bzw. [F7] (oder dem entsprechenden Symbol in der Symbolleiste) weiter ausgeführt werden (ohne den nächsten Sub-Level oder [F7] inklusive dem nächsten Sub-Level.
Wenn Sie eine/n Prozedur/Trigger haben, die/der Cursor enthält, können Sie alternativ das Symbol Run to Cursor verwenden, oder [F4], um einen Teil einer Stored Procedure oder eines Triggers bis zum Cursor im SQL Code Editor auszuführen.
Es ist auch möglich einen Breakpoint über Kommentare zu definieren. Um eine Breakpoint zu definieren, geben Sie folgende Befehlszeile:
-- IBE_BREAKPOINT
oder
/* IBE_BREAKPOINT */
vor der Anweisung, wo der Debug-Prozess stoppen soll, ein.
Messages
Hier wird die Art und Ort des aufgetretenen Fehlers, durch Kennzeichnung der entsprechenden SQL-Zeile angezeigt.
Ergebnisse
Diese Seite erscheint nur, wenn es Ausgabeparameter in der Prozedur gibt.
SQL Editor Messages
Diese werden hier angezeigt, wenn zutreffend.
Wenn Sie ein Prozedurd-Debug durchführen, sehen Sie sich zunächst die Werte der Parameter an und verwenden Sie dann [F8], um schrittweise durch die Prozedur zu gehen (bei [F9] wird dir Prozedur vollständig ausgeführt). Nach jedem Schritt sind alle Variablenwerte sichtbar. Vergessen Sie nicht, mit Breakpoints zu arbeiten [F5]. Natürlich bietet die Debug Prozdeur Symbolleiste all diese Operationen an und mehr.
Bearbeite Prozedur
Prozeduren können direkt im Prozedureneditor bearbeitet werden, der per Doppleklick direkt auf dem Prozedurnamen im DB Explorer gestartet werden kann. Alternativ können Sie den Rechtsklickmenüpunkt Bearbeite Prozedur im DB Explorer oder das Tastaturkürzel [Strg + O] verwenden.
ALTER PROCEDURE
hat genau dieselbe Syntax wie CREATE PROCEDURE
. Wenn Prozeduren geändert werden, wird die ursprüngliche Prozedurendefinition ersetzt. Es mag aussehen, als ob ALTER PROCEDURE
daher nicht notwendig ist, da eine Prozedur gelöscht werden könnte und dann erneut erzeugt werden könnte, um die Änderungen geltend zu machen. Dies wird jedoch nicht funktionieren, wenn die zu ändernde Prozedur von einer anderen Prozedur aufgerufen wird. Wenn Prozedur A Prozedur B aufruft, kann Prozedur B nicht gelöscht werden, da Prozedur A von Prozedur B abhängig ist.
Die SQL Syntax für diesen Befehl lautet:
ALTER PROCEDURE <procedure_name> <revised_input_parameter_list> RETURNS <revised_return_parameter_list> AS <local_variable_declarations> BEGIN <procedure_body> END
Der vollständige Prozedurenkopf und -körper muss in der ALTER PROCEDURE
-Anweisung enthalten sein. Die Syntax ist exakt dieselbe, wie CREATE PROCEDURE
, nur das CREATE
durch ALTER
ersetzt wird.
Wichtig: Vorsicht beim Ändern des Typs, der Anzahl und Reihenfolge der Ein-und Ausgabeparameter einer Prozedur, da vorhandener Anwendungscode davon ausgehen könnte, dass die Prozedur im Originalformat ist.
Verwendtete Prozeduren werden erst geändert, wenn sie nicht mehr in Gebrauch sind.
ALTER PROCEDURE
Änderungen werden mit dem Commit wirksam. Änderungen werden dann in alle Anwendungen reflektiert, die diese Prozedur verwenden ohne zu rekompilieren oder ernuet zu verbinden.
Eine Prozedur kann nur vom ursprünglichen Erzeuger oder vom Benutzer SYSDBA geändert werden.
Eine neue Syntax zur Änderung von Prozeduren oder zur Erzeugung, wenn sie noch nicht vorhanden sind, wurde in der Firebird Version 2.0 eingeführt. Weitere Infos hierzu finden Sie unter CREATE OR ALTER PROCEDURE
.
Prozedur erneut erzeugen
Neu in Firebird 2.0: Die DDL-Anweisung, RECREATE PROCEDURE
, steht jetzt in der DDL zur Verfügung. Die Semantik ist dieselbe, wie für andere RECREATE
-Anweisungen.
Siehe auch:
englischsprachig:
RECREATE PROCEDURE
Lösche Prozedur
Eine Prozedur kann nur gelöscht werden, wenn sie zum Zeitpunkt der Löschung nicht genutzt wird. Sie kann auch nicht gelöscht werden, wenn sie von anderen Prozduren, Triggern, Views oder SELECT
s verwendet wird, solange diese Abhängigkeit nicht entfernt wurde.
Die Seite Prozedureneditor / Abhängigkeiten zeigt an, welche Datenbankobjekte diese Prozedur nutzen und welche Objekte diese Prozedur nutzt. Die meisten Datenbankobjekte können direkt auf der Seite Abhängigkeiten oder dem Abhängigkeiten Ansicht per Rechtsklick auf das gewählte Objekt und dem Menüpunkt Lösche Objekt oder mit [Strg + Entf] gelöscht werden.
Um eine Prozedur zu löschen, verwenden Sie den Rechtsklickmenüpunkt DB Explorer Lösche Prozedur... (oder [Strg + Entf]) oder, wenn der Prozedur bereits im Prozedureneditor geöffnet ist, verwenden Sie das Prozedureneditor Menü (durch Anklicken Prozedur oben links zu öffnen), Lösche Prozedur.
IBExpert bittet um Bestätigung:
bevor die Prozedur entgültig gelöscht wird. Einmal gelöscht, kann sie nicht zurückgeholt werden; die Prozedur muss erneut erzeugt werden, falls sie versehentlich gelöscht wurde!
Die SQL-Syntax hierfür lautet:
DROP PROCEDURE <procedure_name>;
Eine Prozedur kann nur vom Erzeuger, dem SYSDBA oder jedem Benutzer mit Root-Rechte im Betriebssystem.
Siehe auch:
deutschsprachig:
Erzeuge View oder Prozedur von einem SELECT
Abhängigkeiten Ansicht
Prozeduren/Triggers/Views-Analyze
englischsprachig:
SELECT
DDL - Data Definition Language
Stored procedure and trigger language
Writing stored procedures and triggers
Firebird for the database expert - Episode 1: Indexes
Firebird 2.1 Language Reference Update
Firebird 2 Language Reference Update
CREATE PROCEDURE
ALTER PROCEDURE
DROP PROCEDURE
RECREATE PROCEDURE
zurück zum Seitenanfang
<< View | IBExpert | Debugger Collect Statistics Beispiel >>