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

 

动态 SQL 语句

在 C 语言中,字符串存储在字符数组中。动态语句是用 C 语言字符串构造的。然后,可以使用 PREPARE 和 EXECUTE 语句执行这些语句。这些 SQL 语句无法按与静态语句相同的方式引用主机变量,因为在执行 C 程序时无法通过名称访问 C 语言变量。

要在语句与 C 语言变量之间传递信息,请使用名为 SQL 描述符区域 (SQLDA) 的数据结构。如果您在 EXECUTE 语句的 USING 子句中指定一组主机变量,则 SQL 预处理器会为您建立此结构。这些变量按位置对应于预准备语句相应位置中的占位符。

有关 SQLDA 的信息,请参见SQL 描述符区域 (SQLDA)

占位符放在语句中是为了指示要访问主机变量的位置。占位符可以是问号 (?),或者也可以是静态语句中的主机变量引用(主机变量名之前有一个冒号)。在后一种情况下,在语句的实际文本中使用的主机变量名仅充当占位符,指示对 SQL 描述符区域的引用。

用于向数据库传递信息的主机变量称为绑定变量

示例

例如:

EXEC SQL BEGIN DECLARE SECTION;
char comm[200];
char Street[30];
char City[20];
short int cityind;
long empnum;
EXEC SQL END DECLARE SECTION;

...
sprintf( comm, 
    "UPDATE %s SET Street = :?, City = :?"
    "WHERE EmployeeID = :?",
    tablename );
EXEC SQL PREPARE S1 FROM :comm;
EXEC SQL EXECUTE S1 USING :Street, :City:cityind, :empnum;

此方法要求您知道语句中共有多少个主机变量。但程序员对这一点往往并不清楚。因此,可以建立您自己的 SQLDA 结构,并在 EXECUTE 语句的 USING 子句中指定此 SQLDA。

DESCRIBE BIND VARIABLES 语句返回在预准备语句中找到的绑定变量的主机变量名。这使 C 程序可以更容易地管理主机变量。一般的方法如下:

EXEC SQL BEGIN DECLARE SECTION;
char comm[200];
EXEC SQL END DECLARE SECTION;
...
sprintf( comm, "UPDATE %s set Street = :Street,
    City = :City"
   " WHERE EmployeeID = :empnum",
   tablename );
EXEC SQL PREPARE S1 FROM :comm;
/* Assume that there are no more than 10 host variables. 
 * See next example if you cannot put a limit on it. */
sqlda = alloc_sqlda( 10 ); 
EXEC SQL DESCRIBE BIND VARIABLES FOR S1 INTO sqlda;
/* sqlda->sqld will tell you how many 
   host variables there were. */
/* Fill in SQLDA_VARIABLE fields with 
   values based on name fields in sqlda. */
...
EXEC SQL EXECUTE S1 USING DESCRIPTOR sqlda;
free_sqlda( sqlda );
SQLDA 的内容

SQLDA 包含一组变量描述符。每个描述符说明对应的 C 程序变量的属性或者数据库存储数据的位置或检索数据的位置:

有关 SQLDA 结构的完整说明,请参见SQL 描述符区域 (SQLDA)

指示符变量和 NULL

指示符变量用于将 NULL 值传递到数据库或从数据库检索 NULL 值。数据库服务器还使用指示符变量指示在数据库操作过程中遇到的截断条件。当提供的空间不足,无法接收数据库值时,会将指示符变量设置为正值。

有关详细信息,请参见指示符变量