获取有关主机变量的信息(这些主机变量是存储从数据库检索的数据或将数据传递到数据库时所必需的)。
DESCRIBE [ USER TYPES ] [ ALL | BIND VARIABLES FOR | INPUT | OUTPUT | SELECT LIST FOR ] [ LONG NAMES [ long-name-spec ] | WITH VARIABLE RESULT ] [ FOR ] { statement-name | CURSOR cursor-name } INTO sqlda-name
long-name-spec : OWNER.TABLE.COLUMN | TABLE.COLUMN | COLUMN
statement-name : identifier | hostvar
cursor-name:declared cursor
sqlda-name : identifier
USER TYPES 子句 含有 USER TYPES 子句的 DESCRIBE 语句可返回列的域信息。通常,在前一个 DESCRIBE 返回 DT_HAS_USERTYPE_INFO 指示符时会执行这样的 DESCRIBE。
返回的信息与不带 USER TYPES 关键字的 DESCRIBE 返回的信息相同,只不过 sqlname 字段保存的是域名而不是列名。
如果 DESCRIBE 使用 LONG NAMES 子句,则 sqldata 字段会保存此信息。
ALL 子句 DESCRIBE ALL 可用于通过一个向数据库服务器发出的请求来描述 INPUT 和 OUTPUT。这可以提高性能。首先由 OUTPUT 信息填充 SQLDA,然后是 INPUT 信息。sqld 字段包含 INPUT 和 OUTPUT 变量的总数。指示符变量中的 DT_DESCRIBE_INPUT 位是为 INPUT 变量而设,对于 OUTPUT 变量则清零。
BIND VARIABLES FOR 子句 等同于 INPUT 子句。
SELECT LIST FOR 子句 等同于 OUTPUT 子句。
INPUT 子句 绑定变量是数据库执行该语句时由应用程序提供的值。绑定变量可以看作是语句的参数。DESCRIBE INPUT 用绑定变量名填充 SQLDA 中的名称字段。DESCRIBE INPUT 还会将绑定变量的数目放在 SQLDA 的 sqlda 字段中。
DESCRIBE 使用 SQLDA 中的指示符变量提供其它信息。DT_PROCEDURE_IN 和 DT_PROCEDURE_OUT 位是在描述 CALL 语句时在指示符变量中设置的位。DT_PROCEDURE_IN 指示 IN 或 INOUT 参数,而 DT_PROCEDURE_OUT 则指示 INOUT 或 OUT 参数。过程的 RESULT 列将清除这两个位。在说明 OUTPUT 之后,可以使用这些位来区分具有结果集的语句(需要使用 OPEN、FETCH、RESUME 和 CLOSE)和不具有结果集的语句(需要使用 EXECUTE)。DESCRIBE INPUT 仅在绑定变量是 CALL 语句的参数时才相应设置 DT_PROCEDURE_IN 和 DT_PROCEDURE_OUT;作为 CALL 语句参数的表达式中的绑定变量不会设置这些位。
OUTPUT 子句 DESCRIBE OUTPUT 语句将填充 SQLDA 中每个 SELECT 列表项的数据类型和长度。名称字段也用 SELECT 列表项的名称填充。如果为 SELECT 列表项指定了别名,则名称就是该别名。否则,名称从 SELECT 列表项派生:如果该项是简单列名,则使用该项;否则使用表达式的子字符串。DESCRIBE 还会将 SELECT 列表项的数目放在 SQLDA 的 sqld 字段中。
如果所描述的语句是两个或更多 SELECT 语句的 UNION,则为 DESCRIBE OUTPUT 返回的列名就是为第一个 SELECT 语句返回的列名。
如果描述 CALL 语句,则 DESCRIBE OUTPUT 语句将为过程中的每个 INOUT 或 OUT 参数填充 SQLDA 中的数据类型、长度和名称。DESCRIBE OUTPUT 还会将 INOUT 或 OUT 参数的数目放在 SQLDA 的 sqld 字段中。
如果用结果集描述 CALL 语句,则 DESCRIBE OUTPUT 语句将为过程定义中的每个 RESULT 列填充 SQLDA 中的数据类型、长度和名称。DESCRIBE OUTPUT 还会将结果列的数目放在 SQLDA 的 sqld 字段中。
LONG NAMES 子句 LONG NAMES 子句用于为语句或游标检索列名。若无此子句,则列名长度限定于 29 个字符;若有此子句,则支持任意长度的名称。
如果使用了 LONG NAMES,长名称就会放到 SQLDA 的 SQLDATA 字段中,就像从游标中读取一样。将不填充其它任何字段(SQLLEN、SQLTYPE 等)。SQLDA 必须像 FETCH SQLDA 一样设置:它必须为每个列都包含一个条目,且该条目必须是字符串类型。如果存在指示符变量,则会照常指示截断操作。
长名称的缺省规范为 TABLE.COLUMN。
WITH VARIABLE RESULT 子句 此子句用于描述可以有一个以上结果集(具有不同列数或列类型)的过程。
如果使用了 WITH VARIABLE RESULT,则数据库服务器会在 DESCRIBE 语句后将 SQLCOUNT 值设置为以下值之一:
0 结果集可以更改。应该在执行每个 OPEN 语句后再次描述过程调用。
1 结果集是固定的。不需要重新进行描述。
DESCRIBE 语句设置指定的 SQLDA 以描述指定语句的 OUTPUT(等效于 SELECT LIST FOR)或 INPUT(等效于 BIND VARIABLES FOR)。
在使用 INPUT 的情况下,DESCRIBE BIND VARIABLES 不会在 SQLDA 中设置数据类型:这需要由应用程序完成。ALL 关键字用于在同一个 SQLDA 中描述 INPUT 和 OUTPUT。
如果指定了语句名,则先前必须已使用 PREPARE 语句以同一语句名准备了该语句,并且先前必须已分配了 SQLDA。
如果指定了游标名,则先前必须已声明和打开了该游标。缺省操作是描述 OUTPUT。仅 SELECT 语句和 CALL 语句有 OUTPUT。将 SQLDA 的 sqld 字段设置为零后,对其它任何语句或非动态游标执行 DESCRIBE OUTPUT 时都不会显示输出。
在嵌入式 SQL 中,缺省情况下将 NCHAR、NVARCHAR 和 LONG NVARCHAR 分别描述为 DT_FIXCHAR、DT_VARCHAR 和 DT_LONGVARCHAR。如果已经调用了 db_change_nchar_charset 函数,则将这些数据类型分别描述为 DT_NFIXCHAR、DT_NVARCHAR 和 DT_LONGNVARCHAR。
无。
无。
SQL/2008 DESCRIBE OUTPUT 语句是 SQL/2008 标准的可选 SQL 语言功能 B031 "基本动态 SQL"。DESCRIBE INPUT 语句是可选 SQL 语言功能 B032 "扩展动态 SQL"。DESCRIBE 语句的许多其它子句是服务商扩充。其中包括:
USER TYPES、ALL、BIND VARIABLES FOR、LONG NAMES 和 WITH VARIABLE RESULT 子句。
DESCRIBE 使用 INTO 子句标识 sqlda;而在 SQL/2008 标准中,使用 USING 关键字。
在 SQL/2008 标准中,CURSOR 子句以关键字 STRUCTURE 结束。SQL Anywhere 不支持 STRUCTURE。
下面的示例显示如何使用 DESCRIBE 语句:
sqlda = alloc_sqlda( 3 ); EXEC SQL DESCRIBE OUTPUT FOR employee_statement INTO sqlda; if( sqlda->sqld > sqlda->sqln ) { actual_size = sqlda->sqld; free_sqlda( sqlda ); sqlda = alloc_sqlda( actual_size ); EXEC SQL DESCRIBE OUTPUT FOR employee_statement INTO sqlda; } |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |