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 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

DESCRIBE 语句 [ESQL]

此语句用于获取有关存储从数据库中检索的数据所需的主机变量的信息,以及向数据库传递数据所需的主机变量的信息。

语法
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 or 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 变量则清零。

  • 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 中每个选择列表项的数据类型和长度。名称字段也用选择列表项的名称填充。如果为选择列表项指定了别名,则名称就是该别名。否则,名称从选择列表项派生:如果该项是简单列名,则使用该项;否则使用表达式的子字符串。DESCRIBE 还会将选择列表项的数目放在 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   结果集是固定的。不需要重新进行描述。

      有关 SQLDA 结构的用法的详细信息,请参见SQL 描述符区域 (SQLDA)

注释

DESCRIBE 语句设置指定的 SQLDA 以描述指定语句的 OUTPUT(等效于 SELECT LIST)或 INPUT (BIND VARIABLES)。

在使用 INPUT 的情况下,DESCRIBE BIND VARIABLES 不会在 SQLDA 中设置数据类型:这需要由应用程序完成。ALL 关键字用于在同一个 SQLDA 中描述 INPUT 和 OUTPUT。

如果指定了语句名,则先前必须已使用 PREPARE 语句以同一语句名准备了该语句,并且先前必须已分配了 SQLDA(请参见ALLOCATE DESCRIPTOR 语句 [ESQL])。

如果指定了游标名,则先前必须已声明和打开了该游标。缺省操作是描述 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。请参见db_change_nchar_charset 函数

有关如何描述 NCHAR 数据类型的详细信息,请参见数据类型的相关文档:NCHAR 数据类型NVARCHAR 数据类型LONG NVARCHAR 数据类型

权限

无。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   核心特性。一些子句是服务商扩充。

示例

下面的示例显示如何使用 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;
}