この項では、データベースから LONG 値を取り出す方法について説明します。
手順は、静的 SQL と動的 SQL のどちらを使用するかに応じて異なります。
必要に応じて、DECL_LONGVARCHAR、DECL_LONGNVARCHAR、または DECL_LONGBINARY 型のホスト変数を宣言します。array_len メンバーの値は自動的に設定されます。
FETCH、GET DATA、または EXECUTE INTO を使用してデータを取り出します。SQL Anywhere によって次の情報が設定されます。
インジケーター変数 値が NULL の場合は負、トランケーションなしの場合は 0 で、トランケートされていない最大 32767 バイトの正の長さです。
stored_len 配列に格納されるバイト数。常に array_len および untrunc_len 以下になります。
untrunc_len 値がトランケートされなかった場合に配列に格納されるバイト数。常に stored_len 以上になります。トランケートが発生すると、値は array_len より大きくなります。
sqltype フィールドを必要に応じて DT_LONGVARCHAR、DT_LONGNVARCHAR、または DT_LONGBINARY に設定します。
sqldata フィールドを、LONGVARCHAR、LONGNVARCHAR、または LONGBINARY 構造体を指すように設定します。
LONGVARCHARSIZE(n)、LONGNVARCHARSIZE(n)、または LONGBINARYSIZE(n) マクロを使用して、array フィールドに n バイトのデータを保持するために割り付ける合計バイト数を決定できます。
ホスト変数構造体の array_len フィールドを、array フィールドに割り付けるバイト数に設定します。
FETCH、GET DATA、または EXECUTE INTO を使用してデータを取り出します。SQL Anywhere によって次の情報が設定されます。
* sqlind この sqlda フィールドは、値が NULL の場合は負、トランケーションなしの場合は 0 で、トランケートされていない最大 32767 バイトの正の長さです。
stored_len 配列に格納されるバイト数。常に array_len および untrunc_len 以下になります。
untrunc_len 値がトランケートされなかった場合に配列に格納されるバイト数。常に stored_len 以上になります。トランケートが発生すると、値は array_len より大きくなります。
次のコードフラグメントは、動的 Embedded 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 ); } |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |