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

 

Die dynamische SELECT-Anweisung

Eine SELECT-Anweisung, die nur eine einzige Zeile zurückgibt, kann dynamisch vorbereitet werden, gefolgt von einer EXECUTE-Anweisung mit einer INTO-Klausel, um das einzeilige Ergebnis abzurufen. SELECT-Anweisungen, die mehrere Zeilen zurückgeben, werden dagegen mithilfe von dynamischen Cursor verwaltet.

Mit dynamischen Cursor werden Ergebnisse in eine Hostvariablen-Liste geschrieben, oder in einen SQLDA-Bereich, der mit der FETCH-Anweisung angegeben wird (FETCH INTO und FETCH USING DESCRIPTOR). Da die Anzahl der Elemente in der Auswahlliste dem C-Programmierer normalerweise unbekannt ist, wird in der Regel der SQLDA-Bereich benutzt. Die Anweisung DESCRIBE SELECT LIST richtet einen SQLDA-Bereich ein mit Typen für die Elemente der Auswahlliste. Der Platzbedarf für die Werte wird dann mit der Funktion fill_sqlda oder fill_s_sqlda zugewiesen, und die Informationen werden mit der Anweisung FETCH USING DESCRIPTOR abgerufen.

Ein typisches Szenario sieht wie folgt aus:

EXEC SQL BEGIN DECLARE SECTION;
char comm[200];
EXEC SQL END DECLARE SECTION;
int actual_size;
SQLDA * sqlda;
...
sprintf( comm, "SELECT * FROM %s", table_name );
EXEC SQL PREPARE S1 FROM :comm;
/* Initial guess of 10 columns in result. 
   If it is wrong, it is corrected right 
   after the first DESCRIBE by reallocating 
   sqlda and doing DESCRIBE again. */ 
sqlda = alloc_sqlda( 10 );
EXEC SQL DESCRIBE SELECT LIST FOR S1 
  INTO sqlda;
if( sqlda->sqld > sqlda->sqln )
{
  actual_size = sqlda->sqld;
  free_sqlda( sqlda );
  sqlda = alloc_sqlda( actual_size );
  EXEC SQL DESCRIBE SELECT LIST FOR S1
    INTO sqlda;
} 
fill_sqlda( sqlda );
EXEC SQL DECLARE C1 CURSOR FOR S1;
EXEC SQL OPEN C1;
EXEC SQL WHENEVER NOTFOUND {break};
for( ;; )
{
  EXEC SQL FETCH C1 USING DESCRIPTOR sqlda;
  /* do something with data */
}
EXEC SQL CLOSE C1;
EXEC SQL DROP STATEMENT S1;
Anweisungen nach Gebrauch löschen

So stellen Sie sicher, dass Anweisungen beendet werden, damit nicht unnötigerweise Ressourcen gebunden bleiben.

Ein vollständiges Beispiel für den Gebrauch von Cursor für eine dynamische Anweisung finden Sie unter Beispiel für dynamischen Cursor.

Detaillierte Hinweise zu den oben genannten Funktionen finden Sie unter Referenz der Bibliotheksfunktionen.