Collection Contents 上一页 下一页 PDF

ASA SQL 参考

SQL 语句

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 | 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。这可以提高性能。INPUT 信息首先填充 SQLDA,然后是 OUTPUT 信息。sqld 字段包含 INPUT 和 OUTPUT 变量的总数。在指示符变量中,为 INPUT 变量设置了 DT_DESCRIBE_INPUT 位,对 OUTPUT 变量则清除了此位。

INPUT    绑定变量是数据库执行语句时由应用程序提供的值。绑定变量可以看作是语句的参数。DESCRIBE INPUT 用绑定变量名填充 SQLDA 中的名称字段。DESCRIBE INPUT 还将绑定变量的数目放在 SQLDA 的 sqld 字段中。

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)。当绑定变量是 CALL 语句的参数时,DESCRIBE INPUT 仅相应地设置 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 值设置为以下值之一:

有关如何使用 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 时都不会显示输出。

权限 

无。

副作用 

无。

另请参见 
标准和兼容性 
示例 

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

Collection Contents 上一页 下一页 PDF