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; |
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.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |