Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - 编程 » 嵌入式 SQL » 如何使用嵌入式 SQL 发送和检索长整型值

 

使用动态 SQL 检索 LONG 数据

使用动态 SQL 检索 LONG VARCHAR、LONG NVARCHAR 或 LONG BINARY 值。

前提条件

执行此任务没有前提条件。

 任务
  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 数据。

下面的代码段阐释了使用动态嵌入式 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 );
}

 另请参见