Hinweise 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

- 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.
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.
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
- 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.
INSERT INTO Tabellenname
(Spalte01, ... SpalteNN)
values (:recordField01, ... :recordFieldNN)
Implizite SQL-Anweisung UPDATE
- 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.
UPDATE Tabellenname
SET Spalte01 = :Datensatzfeld01,
column02 = :recordField01, ...
SpalteNN = :DatensatzfeldNN
WHERE Schlüsselspalte01 = :Schlüsselfeld01 [ AND
...
SchlüsselspalteNN = :SchlüsselfeldNN ]
Eingebettetes SQL
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.
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.
- 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
- 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
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.