next up previous contents
Next: Globaler Zustand Up: Modulbeschreibungen Previous: Ausführung von ODBC-Anweisungen

EmbeddedSQL

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 gif).

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.

 nnnnnnnn¯ 
DEFINITION  EmbeddedSQL;

CONST

InvHandle = -2; Error = -1; Success = 0; (* return codes *)

SuccessWithInfo = 1; NoDataFound = 100;

showErrors = 1; haltOnErrors = 2; verboseErrorMsg = 3; (* options *)

\ Connection = POINTER TO ConnectionD;

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.





next up previous contents
Next: Globaler Zustand Up: Modulbeschreibungen Previous: Ausführung von ODBC-Anweisungen



Christoph Steindl
Thu Jul 24 14:37:19 MET DST 1997