Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Gespeicherte Prozeduren und Trigger » Prozeduren, Trigger und Batches verwenden

 

Einführung in Batches

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. Weitere Hinweise zu Transact-SQL-Batches finden Sie unter Überblick über Transact-SQL-Batches.

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. Siehe Mehrere SQL-Anweisungen ausführen.

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';