Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere Embedded SQL » Static und Dynamic SQL

 

Dynamic SQL-Anweisungen

In C werden Zeichenfolgen in Zeichen-Arrays gespeichert. Dynamische Anweisungen werden in C-Zeichenfolgen konstruiert. Diese dynamischen Anweisungen können dann mit der PREPARE-Anweisung und der EXECUTE-Anweisung ausgeführt werden. Solche SQL-Anweisungen können Hostvariable nicht in der gleichen Weise ansprechen wie statische Anweisungen, denn auf C-Variable kann nicht über den Namen zugegriffen werden, solange das C-Programm ausgeführt wird.

Um Informationen zwischen dynamischen SQL-Anweisungen und C-Variablen auszutauschen, wird eine Datenstruktur namens SQL-Deskriptorbereich (SQL Descriptor Area - SQLDA) verwendet. Diese Struktur wird vom SQL-Präprozessor erzeugt, wenn Sie bei der EXECUTE-Anweisung in der USING-Klausel eine Liste von Hostvariablen spezifizieren. Jeder Variablen entspricht jeweils ein Platzhalter in der vorbereiteten Anweisung, zugeordnet über die Position.

Hinweise zum SQLDA-Bereich finden Sie unter Der SQL-Deskriptor-Bereich (SQLDA).

Ein Platzhalter wird in die Anweisung eingefügt, um anzuzeigen, wo auf Hostvariable zugegriffen wird. Ein Platzhalter ist entweder ein Fragezeichen (?) oder eine Referenz auf eine Hostvariable wie in statischen Anweisungen (ein Hostvariablen-Name mit einem vorangestellten Doppelpunkt). Im letzteren Fall dient der Name der Hostvariable, der im Text der Anweisung benutzt wird, nur als Platzhalter für eine Referenz auf den SQL-Deskriptorbereich.

Eine Hostvariable, mit der Informationen an die Datenbank übergeben werden, wird eine Bindevariable genannt.

Beispiel

Zum Beispiel:

EXEC SQL BEGIN DECLARE SECTION;
char comm[200];
char Street[30];
char City[20];
short int cityind;
long empnum;
EXEC SQL END DECLARE SECTION;

...
sprintf( comm, 
    "UPDATE %s SET Street = :?, City = :?"
    "WHERE EmployeeID = :?",
    tablename );
EXEC SQL PREPARE S1 FROM :comm;
EXEC SQL EXECUTE S1 USING :Street, :City:cityind, :empnum;

Wenn Sie diese Methode verwenden möchten, müssen Sie wissen, wieviele Hostvariable in der Anweisung vorkommen. Normalerweise ist das nicht der Fall. Daher können Sie Ihre eigene SQLDA-Struktur aufsetzen und diesen SQLDA-Bereich in der USING-Klausel der EXECUTE-Anweisung angeben.

Die Anweisung DESCRIBE BIND VARIABLES gibt die Namen der Hostvariablen zu den Bindevariablen zurück, die in einem Prepared-Statement gefunden wurden. Dies erleichtert es dem C-Programm, die Hostvariablen zu verwalten. Im Folgenden finden Sie die allgemeine Methode:

EXEC SQL BEGIN DECLARE SECTION;
char comm[200];
EXEC SQL END DECLARE SECTION;
...
sprintf( comm, "UPDATE %s set Street = :Street,
    City = :City"
   " WHERE EmployeeID = :empnum",
   tablename );
EXEC SQL PREPARE S1 FROM :comm;
/* Assume that there are no more than 10 host variables. 
 * See next example if you cannot put a limit on it. */
sqlda = alloc_sqlda( 10 ); 
EXEC SQL DESCRIBE BIND VARIABLES FOR S1 INTO sqlda;
/* sqlda->sqld will tell you how many 
   host variables there were. */
/* Fill in SQLDA_VARIABLE fields with 
   values based on name fields in sqlda. */
...
EXEC SQL EXECUTE S1 USING DESCRIPTOR sqlda;
free_sqlda( sqlda );
SQLDA-Inhalt

Der SQLDA-Bereich besteht aus einem Array von Variablendeskriptoren. Jeder Deskriptor beschreibt die Attribute der entsprechenden Variablen des C-Programms, oder die Stelle, an der die Datenbank Daten speichert oder von der sie Daten abruft:

Eine vollständige Beschreibung der SQLDA-Struktur finden Sie unter Der SQL-Deskriptor-Bereich (SQLDA).

Indikatorvariable und NULL

Die Indikatorvariable wird verwendet, um NULL an die Datenbank zu übergeben, oder um NULL von der Datenbank abzurufen. Der Datenbankserver verwendet die Indikatorvariable auch, um anzuzeigen, unter welchen Bedingungen Werte während einer Datenbankoperation gekürzt wurden. Die Indikatorvariable wird mit einem positiven Wert besetzt, wenn nicht genug Platz zur Verfügung stand, um einen Wert von der Datenbank zu erhalten.

Weitere Hinweise finden Sie unter Indikatorvariable.