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 » 发送和检索 Long 型值

 

检索 LONG 数据

本节介绍如何从数据库检索 LONG 值。有关背景信息,请参见发送和检索 Long 型值

使用静态 SQL 时与使用动态 SQL 时的检索过程不同。

♦  接收 LONG VARCHA、LONG NVARCHAR 或 LONG BINARY 值(静态 SQL)
  1. 根据需要声明类型为 DECL_LONGVARCHAR、DECL_LONGNVARCHAR 或 DECL_LONGBINARY 的主机变量。array_len 成员将自动填充。

  2. 使用 FETCH、GET DATA 或 EXECUTE INTO 检索数据。SQL Anywhere 设置以下信息:

    • 指示符变量   指示符变量在值为 NULL 时为负,在未发生截断时为 0,在发生截断时为未截断值的字节数(不超过 32767 的正数)。

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

    • stored_len   数组中存储的字节数。总是小于或等于 array_len 和 untrunc_len。

    • untrunc_len   值不被截断的情况下为数组中将存储的字节数。总是大于或等于 stored_len。如果发生截断,则此值大于 array_len。

♦  将值接收到 LONGVARCHAR、LONGNVARCHAR 或 LONGBINARY 结构中(动态 SQL)
  1. 根据需要将 sqltype 字段设置为 DT_LONGVARCHAR、DT_LONGNVARCHAR 或 DT_LONGBINARY。

  2. 将 sqldata 字段设置为指向 LONGVARCHAR、LONGNVARCHAR 或 LONGBINARY 主机变量结构。

    可以使用 LONGVARCHARSIZE(n)、LONGNVARCHARSIZE(n) 或 LONGBINARYSIZE(n) 宏来确定在数组字段中容纳 n 字节的数据而要分配的总字节数。

  3. 将主机变量结构的 array_len 字段设置为分配给数组字段的字节数。

  4. 使用 FETCH、GET DATA 或 EXECUTE INTO 检索数据。SQL Anywhere 设置以下信息:

    • * sqlind   sqlda 字段在值为 NULL 时为负,在未发生截断时为 0,在发生截断时为未截断值的字节数(不超过 32767 的正数)。

    • stored_len   数组中存储的字节数。总是小于或等于 array_len 和 untrunc_len。

    • untrunc_len   值不被截断的情况下数组中将存储的字节数。总是大于或等于 stored_len。如果发生截断,则此值大于 array_len。

下面的代码段阐释了使用动态嵌入式 SQL 来检索 LONG VARCHAR 数据的机制。它并不是为实际的应用程序而准备的:

#define DATA_LEN 128000
void get_test_var()
{
  LONGVARCHAR *longptr;
  SQLDA       *sqlda;
  SQLVAR      *sqlvar;

  sqlda = alloc_sqlda( 1 );
  longptr = (LONGVARCHAR *)malloc(
               LONGVARCHARSIZE( DATA_LEN ) );
  if( sqlda == NULL || longptr == NULL ) 
  {
    fatal_error( "Allocation failed" );
  }

  // init longptr for receiving data
  longptr->array_len = DATA_LEN;

  // init sqlda for receiving data
  // (sqllen is unused with DT_LONG types)
  sqlda->sqld = 1; // using 1 sqlvar
  sqlvar = &sqlda->sqlvar[0];
  sqlvar->sqltype = DT_LONGVARCHAR;
  sqlvar->sqldata = longptr;
  printf( "fetching test_var\n" );
  EXEC SQL PREPARE select_stmt FROM 'SELECT test_var';
  EXEC SQL EXECUTE select_stmt INTO DESCRIPTOR sqlda;
  EXEC SQL DROP STATEMENT select_stmt;
  printf( "stored_len: %d, untrunc_len: %d, "
          "1st char: %c, last char: %c\n",
        longptr->stored_len,
        longptr->untrunc_len,
        longptr->array[0],
        longptr->array[DATA_LEN-1] );
  free_sqlda( sqlda );
  free( longptr );
}