EmbeddedSQL bietet eine einfach zu handhabende ODBC-Schnittstelle an. Unterstützt wird der vollständige SQL-Umfang (wie vom Datenbanktreiber implementiert) sowie die automatische Umsetzung von Datentypen (siehe Kapitel ).
Zum Datentransfer zwischen der Datenbank und dem Programm werden normale Oberonvarablen innerhalb von SQL-Anweisungen verwendet. Um diese Variablen von Namen, die in der Datenbank verwendet werden (zum Beispiel die Namen von Tabellen und Spalten), zu unterscheiden, wird ihnen ein Doppelpunkt vorangestellt.
In der SQL-Anweisung "`SELECT firstName FROM Persons WHERE age >
:minAge INTO :name"' sind minAge und name Oberonvariablen. minAge ist eine Eingangsvariable, name ist eine Ausgangsvariable. Variablen können entweder skalar sein oder Records. Wenn man eine Rekordvariable angibt, wird diese implizit zur Liste der Komponenten expandiert. Die Anweisung "`SELECT * FROM Persons INTO :person"' ist also äquivalent zur Anweisung "`SELECT * FROM Persons INTO :person.firstName, :person.lastName, :person.age"'.
Bei der Umsetzung der SQL-Anweisungen, die Oberonvariablen enthalten, in SQL-Anweisungen, die der ODBC-Treiber bearbeiten kann, müssen die Bezeichner der Oberonvariablen durch "`?"' ersetzt werden. Zusätzlich müssen dem ODBC-Treiber die Puffer zur Datenkommunikation der Eingangs- und Ausgangsvariablen bekanntgegeben werden. Um von den Variablennamen auf die Adressen und Typen der Variablen zu kommen, wird das Modul Ref [StM96] verwendet, das Zugriff auf die Referenzinformation von geladenen Oberon Modulen bietet. Die Referenzinformation entspricht der Symbolliste des Compilers und enthält unter anderem folgende Informationen: Typen, Prozeduren und globale Variablen eines Moduls, Parameter und lokale Variablen von Prozeduren, Felder von Records.
CONST
InvHandle = -2; Error = -1; Success = 0; (* return codes *)
SuccessWithInfo = 1; NoDataFound = 100;
showErrors = 1; haltOnErrors = 2; verboseErrorMsg = 3; (* options *)
\
ConnectionD = RECORD
ret: INTEGER; (* return code of the last operation *)
dbc-: LONGINT; (* connection handle *)
PROCEDURE (c: Connection) Prepare (sqlString: ARRAY OF CHAR): Statement;
PROCEDURE (c: Connection) Error (str: ARRAY OF CHAR);
PROCEDURE (c: Connection) Commit;
PROCEDURE (c: Connection) Rollback;
PROCEDURE (c: Connection) GetIntInfo (infoNr: INTEGER; VAR info: LONGINT);
PROCEDURE (c: Connection) GetStrInfo (infoNr: INTEGER;
VAR info: ARRAY OF CHAR);
PROCEDURE (c: Connection) GetIntOption (option: INTEGER;
VAR info: LONGINT);
PROCEDURE (c: Connection) SetIntOption (option: INTEGER; info: LONGINT);
PROCEDURE (c: Connection) GetStrOption (option: INTEGER;
VAR info: ARRAY OF CHAR);
PROCEDURE (c: Connection) SetStrOption (option: INTEGER;
info: ARRAY OF CHAR);
END ;
Statement = POINTER TO StatementD;
StatementD = RECORD
ret: INTEGER; (* return code of the last operation *)
stmt-: LONGINT; (* statement handle *)
conn-: Connection; (* the connection on which the statement is executed *)
PROCEDURE (s: Statement) Execute;
PROCEDURE (s: Statement) IsNull (varName: ARRAY OF CHAR): BOOLEAN;
PROCEDURE (s: Statement) SetNull (varName: ARRAY OF CHAR);
PROCEDURE (s: Statement) Fetch (): BOOLEAN;
PROCEDURE (s: Statement) Error (str: ARRAY OF CHAR);
PROCEDURE (s: Statement) RowCount (): LONGINT;
PROCEDURE (s: Statement) GetOption (option: INTEGER; VAR info: LONGINT);
PROCEDURE (s: Statement) SetOption (option: INTEGER; info: LONGINT);
END ;
\< VAR
env-: ODBC.ENV; (* environment handle for the ODBC session *)
options: SET;
PROCEDURE Open (source, user, passwd: ARRAY OF CHAR): Connection;
PROCEDURE OpenUI (connStrIn: ARRAY OF CHAR;
VAR connStrOut: ARRAY OF CHAR): Connection;
PROCEDURE SetOption;
PROCEDURE SQLError (env, dbc, stmt: LONGINT; VAR sqlState: ARRAY OF CHAR;
VAR nativeErr: LONGINT; VAR errMsg: ARRAY OF CHAR): INTEGER;
PROCEDURE ShowError (ret: INTEGER; str: ARRAY OF CHAR; env, dbc,
stmt: LONGINT);
END EmbeddedSQL.
nnnnnnnn¯
DEFINITION EmbeddedSQL;