可以动态准备仅返回单个行的 SELECT 语句,后跟带 INTO 子句的 EXECUTE 以检索单行结果。但是,返回多个行的 SELECT 语句是使用动态游标管理的。
使用动态游标时,将结果放在 FETCH 语句(FETCH INTO 和 FETCH USING DESCRIPTOR)指定的主机变量列表或 SQLDA 中。由于通常不知道选择列表项数,因此最常使用 SQLDA。DESCRIBE SELECT LIST 语句建立具有选择列表项的类型的 SQLDA。然后,使用 fill_sqlda 或 fill_s_sqlda 函数为这些值分配空间,由 FETCH USING DESCRIPTOR 语句检索信息。
典型的情况如下:
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; |
为避免占用不必要的资源,请确保在使用语句后将其删除。
有关使用动态选择语句的游标的完整示例,请参见动态游标示例。
有关上述函数的详细信息,请参见库函数参考。
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |