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.
Das Beispiel für den dynamischen Cursor zeigt den Einsatz von Cursor für eine dynamische SELECT-Anweisung.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |