SQL-Datenzugriff

EGL unterstützt den Zugriff auf relationale Datenbanken über SQL.

EGL unterstützt SQL (Structured Query Language) wie folgt:

Typische SQL-Verarbeitung

Die typische SQL-Verarbeitung beginnt mit einer EGL-Anweisung 'open'. Die Anweisung 'open' sendet eine Gruppe von Kriterien an die Datenbankmanagement-Software und ruft im Gegenzug eine Ergebnismenge (Zeilen übereinstimmender Daten) ab. Die Ergebnismenge protokolliert die Zeile, auf die sie zeigt. Mithilfe einer der Varianten der Anweisung 'get' können Sie Daten aus der Ergebnismenge sequenziell oder nach relativer bzw. absoluter Position lesen.

Das Verhalten von EGL im Hintergrund ist bei COBOL anders als bei Java™. COBOL-Code interpretiert die Anweisung 'open' als eine Serie von SQL-Anweisungen und verwendet den SQL-Cursor, um die Position in der Ergebnismenge beizubehalten. Die folgenden SQL-Anweisungen sind äquivalent zu einer EGL-Anweisung 'open' in COBOL:
  • Eine Anweisung DECLARE zum Erstellen eines Cursors.
  • Eine Anweisung OPEN zum Aktivieren des Cursors.
  • Eine Anweisung SELECT zum Erstellen einer Ergebnismenge.

Java-Code verwendet ein Anweisungsobjekt 'Statement' zum Erstellen eines Ergebnismengenobjekts 'ResultSet'.

Eine Anweisung 'get' mit einer Positionsoption (wie beispielsweise 'next' oder 'absolute') generiert eine SQL-Anweisung FETCH in COBOL (und eine äquivalente Anweisung in Java), um die Daten aus einer bestimmten Zeile abzurufen.

Sie können die Anweisung 'get' auch ohne Positionsoption und ohne vorherige Verwendung der Anweisung 'open' verwenden. In diesem Fall generiert 'get' die folgende SQL-Anweisung in COBOL (und eine äquivalente Anweisung in Java):
  • Eine Anweisung DECLARE zum Erstellen eines Cursors.
  • Eine Anweisung OPEN zum Aktivieren des Cursors.
  • Eine Anweisung SELECT zum Erstellen einer Ergebnismenge.
  • Eine Anweisung FETCH zum Abrufen der ersten Zeile.
  • Eine Anweisung CLOSE zum Löschen der Ergebnismenge und des Cursors (sofern die Anweisung 'get' keine Klausel 'forUpdate' einschließt, was untypisch ist).

Wenn Sie eine Ergebnismenge mit der Anweisung 'get' erstellen, ruft EGL die erste Zeile ab und schließt die Ergebnismenge daraufhin. Da 'get' die Ergebnismenge schließt, können Sie anschließend keine positionsgebundene Anweisung 'get' ausgeben. Um wiederholte positionsgebundene get-Anweisungen zu verwenden, müssen Sie die Verarbeitung mit einer EGL-Anweisung 'open' beginnen und am Ende eine EGL-Anweisung 'close' ausgeben.

Implizite SQL-Anweisungen

EGL generiert SQL-Anweisungen auf Basis der Eigenschaften und Werte Ihrer SQL-Datensatzvariablen (siehe Stereotyp 'SQLRecord').

Betrachten Sie beispielsweise den folgenden EGL-Quellcode:
Record CustomerRecord type SQLRecord 
{ tableNames=[["Customer"]], keyItems=["customerNumber"] }
  customerNumber INT {column = "customer_number"};
  customerName STRING {column = "customer_name"};
  customerBalance DECIMAL(9,2) {column = "customer_balance"};
end

program CustomerTest type BasicProgram

myCustomer CustomerRecord;

  function main()
    myCustomer.customerNumber = 1001;
    get myCustomer;
    printCustomer(myCustomer);
  end
end
EGL setzt die Anweisung 'get myCustomer;' in SQL-Anweisungen vom Typ DECLARE und OPEN, in den folgenden SQL-SELECT-Code und schließlich in SQL-Anweisungen vom Typ FETCH und CLOSE um:
select
	customer_number, customer_name, customer_balance
into :myCustomer.customerNumber, :myCustomer.customerName, 
	:myCustomer.customerBalance
from Customer
where
	customer_number = :myCustomer.customerNumber
Der Code wird als implizit bezeichnet, da der gesamte Inhalt durch Elemente in der SQL-Datensatzvariablen 'myCustomer' impliziert wird. Infolge dieses Codes führt EGL die folgenden Aktionen aus:
  • Die SELECT-Klausel verwendet die EGL-Eigenschaft 'column' auf Feldebene, um alle Spalten zu lokalisieren, die den Feldern im Datensatz entsprechen.
  • Die INTO-Klausel listet die Variablen auf, die den Spalten in der SELECT-Klausel entsprechen. Variablen, die mit einem Doppelpunkt (:) beginnen, werden als Hostvariablen bezeichnet (siehe Hostvariablen).
  • Die FROM-Klausel übernimmt den Tabellennamen aus der EGL-Eigenschaft 'tableNames' auf Datensatzebene.
  • Die WHERE-Klausel verwendet den Wert der EGL-Eigenschaft 'keyItems' auf Datensatzebene als Schlüssel zur Datenbanktabelle.

Diese SQL-SELECT-Klausel ist über den Editor sichtbar. Mithilfe des Editors können Sie den Code explizit machen, indem Sie ihn in eingebettete SQL-Anweisungen umwandeln, die geändert werden können. Weitere Informationen finden Sie unter Implizite SQL-Anweisungen anzeigen im Handbuch für EGL-Programmierer.

Wenn Sie bereits wissen, wie SQL-Anweisungen geschrieben werden, bietet das Erstellen eingebetteter SQL-Anweisungen mehr Flexibilität.

Eingebettete SQL-Anweisungen

Für die von Ihnen eingebetteten SQL-Anweisungen führt EGL Syntaxprüfungen oder andere Prüfungen nur in sehr geringem Umfang durch. Implizite SQL-Anweisungen werden stets von eingebetteten SQL-Anweisungen überschrieben, und zwar auch dann, wenn die eingebetteten Anweisungen Fehler enthalten. Aus diesem Grund ist bei der Verwendung eingebetteter SQL-Anweisungen Vorsicht geboten.

Informationen zur Syntax der Direktive '#sql' sowie entsprechende Beispiele finden Sie im Abschnitt 'Direktive '#sql''.

Dynamisches SQL

Dynamischer SQL-Code wird zur Ausführungszeit assembliert und ist besonders in Situationen nützlich, in denen Benutzer Abfragen über Ihre Anwendung selbst generieren. So verfügt ein Benutzer möglicherweise über eine Liste von Kontrollkästchen für potenzielle Berichtsfelder. Ihre Anwendung kann eine Anweisung SELECT auf Basis der von Ihrem Benutzer bereitgestellten Kriterien erstellen.

Dynamisches SQL kann sich negativ auf die Leistung auswirken. Daher müssen Sie diesen Nachteil gegen die zusätzlich gebotene Flexibilität abwägen.

Als Regel gilt: Verwenden Sie die EGL-Anweisung 'prepare', um die Auswahlkriterien, die Art der Datenaggregation oder die Reihenfolge der zurückgegebenen Zeilen zu variieren. Diese Aspekte werden von den Klauseln WHERE, HAVING, GROUP BY und ORDER BY gesteuert. Weitere Informationen finden Sie unter prepare.

Im Rahmen der Kompatibilität zwischen EGL und VisualAge Generator können Sie mithilfe von Tabellenvariablen dynamisch eine Tabelle für die Laufzeitverarbeitung auswählen. Weitere Informationen zu dieser Option finden Sie unter Stereotyp 'SQLRecord'. Die dynamische Auswahl von Tabellen erfolgt üblicherweise anhand der Anweisung 'prepare'.


Feedback