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

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » 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 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;
Hinweis

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

Das Beispiel für den dynamischen Cursor zeigt den Einsatz von Cursor für eine dynamische SELECT-Anweisung.

 Siehe auch