Überlegungen zu 'execute' mit SQL

Im Kontext von SQL wird die EGL-Anweisung 'execute' üblicherweise verwendet, um eine vorbereitete SQL-Anweisung mit dynamischen Elementen auszuführen.

Mit dieser Anweisung können Sie auch implizite Lösch-, Einfüge- oder Aktualisierungsabfragen erstellen oder eingebettete SQL-Anweisungen aus einer beschränkten Liste verfügbarer Befehle schreiben.

Syntax

Syntaxdiagramm für die Anweisung 'execute'
ID_der_vorbereiteten_Anweisung
Die Kennung, die Sie dem vorbereiteten SQL-Code unter Verwendung der EGL-Anweisung 'prepare' zugeordnet haben. Dies ist die häufigste Verwendung der Anweisung 'execute'. Hierbei ist normalerweise dynamisches SQL involviert. Weitere Informationen zu dynamischem SQL finden Sie unter SQL-Datenzugriff.
using ... Feld
Gibt die EGL-Hostvariablen an (siehe Hostvariablen), die der vorbereiteten SQL-Anweisung zur Ausführungszeit zur Verfügung stehen. Fügen Sie in einer Klausel wie dieser (die sich außerhalb eines #sql-Blocks befindet) keinen Doppelpunkt vor dem Namen einer Hostvariablen ein.
for SQL-Datensatzvariable
Wenn Sie eine implizite SQL-Anweisung erstellen ('delete', 'insert' oder 'update') verwendet EGL diese SQL-Datensatzvariable, um den Inhalt der betreffenden Anweisung festzulegen, wie unter 'Impliziten SQL-Code generieren' in diesem Thema beschrieben wird. Anhand des SQL-Datensatzes können Sie das Ergebnis der Operation testen, wie im folgenden Beispiel:
onException (sqlEx SQLException)
  if (myCustomer is unique)
    myErrorHandler(8); 
  end 
end
delete, insert, update
Verwenden Sie diese Schlüsselwörter, um eine implizite SQL-Anweisung des angegebenen Typs anzufordern. Eine Übersicht der impliziten SQL-Anweisungen finden Sie unter SQL-Datenzugriff. Wenn Sie eines dieser Schlüsselwörter verwenden, schließen Sie eine SQL-Datensatzvariable in die Anweisung 'execute' ein.
#sql{ SQL-Anweisung }
Weitere Informationen zur Verwendung dieses Typs einer eingebetteten SQL-Anweisung finden Sie unter sql (Direktive). Wenn die SQL-Anweisung eine Zeile in einer Ergebnismenge aktualisieren oder löschen soll, schreiben Sie den Code für eine SQL-Anweisung UPDATE oder DELETE mit der folgenden Klausel:
  WHERE CURRENT OF Ergebnismengen-ID
Ergebnismengen-ID
Die Ereignismengen-ID, die in der EGL-Anweisung 'open' oder 'get' angegeben wurde, die die Ergebnismenge verfügbar gemacht hat.

Zwischen '#sql' und der linken geschweiften Klammer darf kein Leerzeichen stehen.

Impliziten SQL-Code generieren

Sie können impliziten SQL-Code mithilfe der Anweisung 'execute' generieren, um bestimmte Datenbankoperationen auszuführen, ohne zunächst eine EGL-Anweisung 'open' oder 'get' ausgeben zu müssen. EGL verdeckt normalerweise die Details des SQL-Datenbankzugriffs wie beispielsweise die Bearbeitung von Zeilenpositionen in der Ergebnismenge. Mithilfe der Anweisung 'execute' können Sie direkt die Datenbankzeilen angeben, die Sie ändern wollen, indem Sie die Eigenschaft 'defaultSelectCondition' des SQL-Datensatzabschnitts setzen.

So können Sie beispielsweise die Eigenschaft 'defaultSelectCondition' in Ihrem CustomerRecord-Abschnitt setzen, um alle Kunden zu suchen, für die seit fünf Jahren keine Aktivitäten durchgeführt wurden. (Informationen zur entsprechenden Vorgehensweise finden Sie unter #sqlCondition, Direktive.) Löschen Sie anschließend das Schlüsselfeld aus der zugeordneten SQL-Datensatzvariablen 'myCustomer', damit alle Kundennummern den Filter passieren können. Um alle ausgewählten Kunden aus der Kundendatenbank 'Customer' zu entfernen, ohne eine Ergebnismenge erstellen zu müssen, verwenden Sie die folgende EGL-Anweisung:
execute delete myCustomer;

Bei der Verwendung dieser impliziten SQL-Befehle ist Vorsicht geboten, da keine Sicherheitseinrichtungen vorhanden sind.

Implizite SQL-Anweisung DELETE

Die implizite SQL-Anweisung DELETE legt anhand der SQL-Datensatzeigenschaft 'defaultSelectCondition' die Tabellenzeilen fest, die gelöscht werden sollen, wenn der Wert in den Schlüsselspalten der SQL-Tabelle jeweils mit dem Wert in dem entsprechenden Schlüsselfeld der SQL-Datensatzvariablen identisch ist. Wenn Sie keinen Datensatzschlüssel bzw. keine Standardauswahlbedingung angeben, werden alle Tabellenzeilen gelöscht.

Die von EGL generierte implizite SQL-Anweisung DELETE hat folgende Syntax:
  DELETE FROM Tabellenname
  WHERE  [ Standardauswahlbedingung AND ]
         Schlüsselspalte01 = :Schlüsselfeld01 [ AND
         ...
         SchlüsselspalteNN = :SchlüsselfeldNN ]

Sie können mit einer einzelnen EGL-Anweisung nicht Zeilen aus mehreren Datenbanktabellen löschen.

Implizite SQL-Anweisung INSERT

Die implizite SQL-Anweisung INSERT führt standardmäßig die folgenden Aktionen aus:
  • Der Schlüsselwert in der SQL-Datensatzvariablen legt die logische Position der Daten in der Tabelle fest. Ein Datensatz ohne Schlüssel wird gemäß der SQL-Tabellendefinition und den Regeln der Datenbank verarbeitet.
  • Infolge der Zuordnungen zwischen Datensatzfeldern und SQL-Tabellenspalten in der SQL-Datensatzdeklaration stellt der generierte Code die Daten aus den einzelnen Feldern in der Datensatzvariablen in die jeweils zugehörige SQL-Tabellenspalte.
  • Wenn Sie ein Datensatzfeld als schreibgeschützt deklariert haben, wird dieses Datensatzfeld nicht in die generierte SQL-Anweisung INSERT eingeschlossen, und das Datenbankmanagementsystem setzt den Wert der zugehörigen SQL-Tabellenspalte auf den Standardwert, der beim Definieren der Spalte angegeben wurde.
Die von EGL generierte implizite SQL-Anweisung INSERT hat folgende Syntax:
  INSERT INTO Tabellenname
    (Spalte01, ... SpalteNN)
    values (:Datensatzfeld01, ... :DatensatzfeldNN)

Implizite SQL-Anweisung UPDATE

Die implizite SQL-Anweisung UPDATE führt standardmäßig die folgenden Aktionen aus:
  • Wenn der Wert in einer Schlüsselspalte der SQL-Tabelle mit dem Wert im entsprechenden Schlüsselfeld des SQL-Datensatzes identisch ist, legt die SQL-Datensatzeigenschaft 'defaultSelectCondition' anhand dieser Informationen fest, welche Tabellenzeilen ausgewählt werden. Wenn Sie keinen Datensatzschlüssel bzw. keine Standardauswahlbedingung angeben, werden alle Tabellenzeilen aktualisiert.
  • Infolge der Zuordnungen zwischen Datensatzfeldern und SQL-Tabellenspalten in der SQL-Datensatzdeklaration empfängt eine bestimmte SQL-Tabellenspalte den Inhalt des zugehörigen Felds in der Datensatzvariablen. Ist eine SQL-Tabellenspalte jedoch einem schreibgeschützten Datensatzfeld zugeordnet, wird die betreffende Spalte nicht akutalisiert.
Die implizite SQL-Anweisung UPDATE hat die folgende Syntax:
  UPDATE Tabellenname
  SET    Spalte01 = :Datensatzfeld01, 
         Spalte02 = :Datensatzfeld02, ... 
         SpalteNN = :DatensatzfeldNN
  WHERE  Schlüsselspalte01 = :Schlüsselfeld01 [ AND
         ...
         SchlüsselspalteNN = :SchlüsselfeldNN ] 

Eingebettetes SQL

Sie können die Anweisung 'execute' verwenden, um eine lange Serie von Zeilen aus einer Datenbank zu löschen, ohne zuvor eine Anweisung 'open' oder 'get' ausführen zu müssen. Um eine Serie von Zeilen zu löschen, betten Sie eine SQL-Anweisung DELETE mit einer WHERE-Klausel ein, die die Bedingungen für die Löschoperation festlegt. Im folgenden Beispiel bereinigt ein Unternehmen seine Datenbank um alle Kunden, die seit dem Zieldatum (targetDate), das zuvor im EGL-Code festgelegt wurde, keine Bestellung mehr aufgegeben haben:
execute #sql{
  DELETE FROM Customer
  WHERE last_order_date < :targetDate
};

Die EGL-Variable targetDate wird im SQL-Code zu einer Hostvariablen (mit vorangestelltem Doppelpunkt). Weitere Informationen finden Sie unter Hostvariablen.

Anmerkung: Bei Multiple-Row-Operationen für mehrere Zeilen können Sie keine statische Feldgruppe in einem strukturierten Datensatz als Hostvariablen verwenden.

Anhand einer vergleichbaren Syntax können Sie auch SQL-Anweisungen vom Typ INSERT oder UPDATE einbetten.

Sie können die EGL-Anweisung 'execute' nicht verwenden, um eine SQL-Anweisung einzubetten, die eine Ergebnismenge zurückgibt. Dies liegt daran, dass Sie den Cursor nicht direkt steuern können. EGL verarbeitet alle Cursordefinitionen und das Cursor-Management intern.

Mit einer Anweisung 'execute' können Sie SQL-Anweisungen der folgenden Typen ausgeben:
  • ALTER
  • CALL
  • CREATE ALIAS
  • CREATE INDEX
  • CREATE SYNONYM
  • CREATE TABLE
  • CREATE VIEW
  • DECLARE globale_temporäre_Tabelle
  • DELETE
  • DROP INDEX
  • DROP SYNONYM
  • DROP TABLE
  • DROP VIEW
  • GRANT
  • INSERT
  • LOCK
  • RENAME
  • REVOKE
  • SAVEPOINT
  • SET
  • SIGNAL
  • UPDATE
  • VALUES
Sie können die Anweisung 'execute' nicht verwenden, um SQL-Anweisungen der folgenden Typen auszugeben:
  • CLOSE
  • COMMIT
  • CONNECT
  • CREATE FUNCTION
  • CREATE PROCEDURE
  • DECLARE CURSOR
  • DESCRIBE
  • DISCONNECT
  • EXECUTE
  • EXECUTE IMMEDIATE
  • FETCH
  • OPEN
  • PREPARE
  • ROLLBACK WORK
  • SELECT
  • INCLUDE SQLCA
  • INCLUDE SQLDA
  • WHENEVER

Beispiele

Es folgt eine Reihe von Beispielen zur Anweisung 'execute'. In diesen Beispielen ist myCustomer eine SQL-Datensatzvariable:
execute #sql{ 
  create table Customer (
    customer_number int not null,
    customer_name char(40) not null,
    customer_balance decimal(9,2) not null)
};

execute update for myCustomer;

execute #sql{ 
  call aStoredProcedure( :parameterVar)
};

execute myPreparedStatement;

Fehlerbedingungen

Zur Deklarationszeit tritt ein Fehler auf, wenn Sie einen Aufruf für eine implizite Lösch-, Einfüge- oder Aktualisierungsabfrage ausgeben, aber keine SQL-Datensatzvariable angeben.

Ein Fehler tritt in den impliziten Einfüge- bzw. Aktualisierungsabfragen auf, wenn die einzigen verfügbaren Hostvariablen schreibgeschützt sind.


Feedback