Ein Batch ist ein Satz von SQL-Anweisungen, die gemeinsam abgesetzt und als Gruppe, eine nach der anderen, ausgeführt werden. Die in Prozeduren verwendeten Steueranweisungen (CASE, IF, LOOP ect.) können auch in Batches verwendet werden. Wenn der Batch aus einer zusammengesetzten Anweisung besteht, die von BEGIN/END umschlossen ist, kann er auch Hostvariable, lokale Deklarationen für Variable, Cursor, temporäre Tabellen und Ausnahmefehler enthalten. Hostvariablen-Referenzen sind innerhalb von Batches mit folgenden Einschränkungen zulässig:
Nur eine Anweisung im Batch darf Hostvariable referenzieren.
Der Anweisung, die Hostvariable verwendet, darf keine Anweisung vorangehen, die eine Ergebnismenge zurückgibt.
Die Verwendung von BEGIN/END wird empfohlen, um eindeutig anzugeben, wann ein Batch verwendet wird.
Anweisungen im Batch können durch Semikolons begrenzt werden. In diesem Fall entspricht der Batch dem Watcom-SQL-Dialekt. Ein Batch mit mehreren Anweisungen, der keine Semikolons zur Begrenzung der Anweisungen verwendet, entspricht dem Transact-SQL-Dialekt. Der Dialekt des Batches legt fest, welche Anweisungen innerhalb des Batches zulässig sind und wie Fehler im Batch behandelt werden.
Batches sind gespeicherten Prozeduren ähnlich, allerdings gibt es einige Unterschiede:
Batches haben keine Namen.
Batches akzeptieren keine Parameter.
Batches werden nicht dauerhaft in der Datenbank gespeichert.
Batches können nicht von verschiedenen Verbindungen gemeinsam genutzt werden.
Ein einfacher Batch besteht aus einer Gruppe von SQL-Anweisungen ohne Trennzeichen, gefolgt von einer separaten Zeile, auf der nur das Wort "go" steht. Im folgenden Beispiel wird die Abteilung "Eastern Sales" erstellt und alle Vertreter von Massachusetts werden in diese Abteilung versetzt. Dies ist ein Beispiel eines Transact-SQL-Batches.
INSERT INTO Departments ( DepartmentID, DepartmentName ) VALUES ( 220, 'Eastern Sales' ) UPDATE Employees SET DepartmentID = 220 WHERE DepartmentID = 200 AND State = 'MA' COMMIT go |
Das Wort "go" wird von Interactive SQL erkannt und bewirkt, dass die vorherigen Anweisungen als ein einziger Batch an den Server gesendet werden.
Das folgende Beispiel sieht zwar ähnlich aus, wird aber von Interactive SQL unterschiedlich behandelt. In diesem Beispiel wird der Transact-SQL-Dialekt nicht benutzt. Jede Anweisung wird durch ein Semikolon abgeschlossen. Interactive SQL sendet jede durch Semikolon abgeschlossene Anweisung separat an den Server. Sie wird nicht als Batch behandelt.
INSERT INTO Departments ( DepartmentID, DepartmentName ) VALUES ( 220, 'Eastern Sales' ); UPDATE Employees SET DepartmentID = 220 WHERE DepartmentID = 200 AND State = 'MA'; COMMIT; |
Um die Behandlung durch Interactive SQL als Batch zu erreichen, können Anweisungen mit BEGIN ... END
. Die folgende Darstellung ist eine geänderte Version des vorherigen Beispiels. Die drei Anweisungen in der zusammengesetzten
Anweisung werden als Batch an den Server gesendet.
BEGIN INSERT INTO Departments ( DepartmentID, DepartmentName ) VALUES ( 220, 'Eastern Sales' ); UPDATE Employees SET DepartmentID = 220 WHERE DepartmentID = 200 AND State = 'MA'; COMMIT; END |
In diesem Beispiel hat es keine Auswirkungen auf das Endergebnis, ob ein Batch oder einzelne Anweisungen vom Server ausgeführt werden. In manchen Situationen kann es jedoch Auswirkungen geben. Beachten Sie das folgende Beispiel.
DECLARE @CurrentID INTEGER; SET @CurrentID = 207; SELECT Surname FROM Employees WHERE EmployeeID=@CurrentID; |
Wenn Sie dieses Beispiel unter Verwendung von Interactive SQL ausführen, meldet der Datenbankserver einen Fehler, der angibt, dass die Variable nicht gefunden werden kann. Dieser Fehler wird gemeldet, da Interactive SQL drei separate Anweisungen an den Server sendet. Sie werden nicht als Batch ausgeführt. Wie bereits erläutert wurde, kann das Problem gelöst werden, indem eine zusammengesetzte Anweisung benutzt wird, um Interactive SQL zu zwingen, diese Anweisungen als Batch an den Server zu senden. Mit dem folgenden Beispiel wird dies erreicht.
BEGIN DECLARE @CurrentID INTEGER; SET @CurrentID = 207; SELECT Surname FROM Employees WHERE EmployeeID=@CurrentID; END |
Wenn eine Gruppe von Anweisungen in BEGIN und END gesetzt wird, verarbeitet Interactive SQL sie als Batch.
Die IF-Anweisung ist ein weiteres Beispiel einer zusammengesetzten Anweisung. Interactive SQL sendet die folgenden Anweisungen als einen einzelnen Batch an den Server.
IF EXISTS( SELECT * FROM SYSTAB WHERE table_name='Employees' ) THEN SELECT Surname AS LastName, GivenName AS FirstName FROM Employees; SELECT Surname, GivenName FROM Customers; SELECT Surname, GivenName FROM Contacts; ELSE MESSAGE 'The Employees table does not exist' TO CLIENT; END IF |
Diese Situation tritt nicht auf, wenn andere Techniken zum Vorbereiten und Ausführen von SQL-Anweisungen benutzt werden. Eine Anwendung, die ODBC benutzt, kann beispielsweise eine Reihe von durch Semikolon getrennten Anweisungen als Batch vorbereiten und ausführen.
Beim Mischen von Interactive SQL-Anweisungen mit SQL-Anweisungen, die für den Server bestimmt sind, sollte man Vorsicht walten lassen. Das folgende Beispiel zeigt, welche Probleme beim Mischen von Interactive SQL-Anweisungen und SQL-Anweisungen auftreten können. In diesem Beispiel ist die Interactive SQL OUTPUT-Anweisung in die zusammengesetzte Anweisung eingebettet. Daher wird sie mit allen anderen Anweisungen zusammen als Batch an den Server gesendet, was zu einem Syntaxfehler führt.
IF EXISTS( SELECT * FROM SYSTAB WHERE table_name='Employees' ) THEN SELECT Surname AS LastName, GivenName AS FirstName FROM Employees; SELECT Surname, GivenName FROM Customers; SELECT Surname, GivenName FROM Contacts; OUTPUT TO 'c:\\temp\\query.txt'; ELSE MESSAGE 'The Employees table does not exist' TO CLIENT; END IF |
Die richtige Anordnung der OUTPUT-Anweisung wird unten gezeigt.
IF EXISTS( SELECT * FROM SYSTAB WHERE table_name='Employees' ) THEN SELECT Surname AS LastName, GivenName AS FirstName FROM Employees; SELECT Surname, GivenName FROM Customers; SELECT Surname, GivenName FROM Contacts; ELSE MESSAGE 'The Employees table does not exist' TO CLIENT; END IF; OUTPUT TO 'c:\\temp\\query.txt'; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |