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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere Embedded SQL » Lange Werte senden und abfragen

 

LONG-Daten abrufen

Dieser Abschnitt beschreibt, wie Sie LONG-Werte aus der Datenbank abrufen. Hintergrundinformationen finden Sie unter Lange Werte senden und abfragen.

Die Prozeduren unterscheiden sich abhängig davon, ob Sie Static oder Dynamic SQL verwenden.

♦  So rufen Sie einen LONG VARCHAR-, LONG NVARCHAR- oder LONG BINARY-Wert ab (Static SQL)
  1. Deklarieren Sie eine Hostvariable vom Typ DECL_LONGVARCHAR, DECL_LONGVARCHAR oder DECL_LONGBINARY, wie erforderlich. Das Array-Element array_len member wird automatisch ausgefüllt.

  2. Rufen Sie die Daten mit FETCH, GET DATA oder EXECUTE INTO ab. SQL Anywhere legt die folgenden Informationen fest:

    • Indikatorvariable   Negativ, wenn der Wert NULL ist, 0, wenn es keine Kürzung gibt, andernfalls die ungekürzte Länge in Byte bis zu einem Maximim von 32767.

      Weitere Hinweise finden Sie unter Indikatorvariable.

    • stored_len   Die Anzahl der im Array gespeicherten Byte. Immer kleiner oder gleich array_len und untrunc_len.

    • untrunc_len   Die Anzahl der Byte, die im Array gespeichert würden, wenn der Wert nicht gekürzt würde. Immer größer oder gleich stored_len. Bei Kürzung ist dieser Wert größer als array_len.

♦  So nehmen Sie einen Wert in eine LONGVARCHAR-, LONGNVARCHAR- oder LONGBINARY-Struktur auf (Dynamic SQL)
  1. Stellen Sie das sqltype-Feld auf DT_LONGVARCHAR, DT_LONGNVARCHAR oder DT_LONGBINARY ein, wie erforderlich.

  2. Setzen Sie das Feld sqldata so, dass es auf die Hostvariablenstruktur LONGVARCHAR, LONGNVARCHAR oder LONGBINARY zeigt.

    Sie können den Makro LONGVARCHARSIZE(n ), LONGNVARCHARSIZE(n) oder LONGBINARYSIZE(n) verwenden, um die Gesamtanzahl der Byte zu bestimmen, die zugeordnet werden müssen, um n Byte von Daten im Array-Feld aufzunehmen.

  3. Stellen Sie das array_len-Feld der Hostvariablenstruktur auf die Anzahl der Bytes ein, die dem Array-Feld zugeordnet sind.

  4. Rufen Sie die Daten mit FETCH, GET DATA oder EXECUTE INTO ab. SQL Anywhere legt die folgenden Informationen fest:

    • * sqlind   Dieses sqlda-Feld ist negativ, wenn der Wert NULL ist, oder 0, wenn es keine Kürzung gibt, beziehungsweise die positive ungekürzte Länge in Byte bis zu einem Höchstwert von 32767.

    • stored_len   Die Anzahl der im Array gespeicherten Byte. Immer kleiner oder gleich array_len und untrunc_len.

    • untrunc_len   Die Anzahl der Byte, die im Array gespeichert würden, wenn der Wert nicht gekürzt würde. Immer größer oder gleich stored_len. Bei Kürzung ist dieser Wert größer als array_len.

Das folgende Codefragment illustriert den Mechanismus, der zum Abrufen von LONG VARCHAR-Daten mittels dynamischem Embedded SQL verwendet wird. Er dient nur zur Illustration und ist nicht für eine tatsächliche Verwendung bestimmt.

#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 );
}