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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere 嵌入式 SQL » 静态和动态 SQL

 

动态 SELECT 语句

可以动态准备仅返回单个行的 SELECT 语句,后跟带 INTO 子句的 EXECUTE 以检索单行结果。但是,返回多个行的 SELECT 语句是使用动态游标管理的。

使用动态游标时,将结果放在 FETCH 语句(FETCH INTO 和 FETCH USING DESCRIPTOR)指定的主机变量列表或 SQLDA 中。由于 C 程序员通常不知道选择列表项数,因此最常使用 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;
使用后删除语句

为避免占用不必要的资源,请确保在使用语句后将其删除。

有关使用动态选择语句的游标的完整示例,请参见动态游标示例

有关上述函数的详细信息,请参见库函数参考