データベースから取り出したデータを格納するために必要なホスト変数、またはデータベースにデータを渡すために必要なホスト変数に関する情報を取得します。
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 : 宣言されたカーソル
sqlda-name : identifier
USER TYPES 句 USER TYPES 句を持つ DESCRIBE 文は、カラムのドメインに関する情報を返します。通常、このような DESCRIBE は、以前の DESCRIBE が DT_HAS_USERTYPE_INFO のインジケーターを返したときに行われます。
返された情報は、sqlname フィールドがカラム名の代わりにドメインの名前を保持すること以外は、USER TYPES キーワードのない DESCRIBE と同じです。
DESCRIBE が LONG NAMES 句を使用する場合は、sqldata フィールドがこの情報を保持します。
ALL 句 DESCRIBE ALL を使用すると、データベースサーバーへの 1 回の要求で INPUT と OUTPUT を記述できます。これにはパフォーマンス上の利点があります。OUTPUT 情報が最初に SQLDA に格納され、次に INPUT 情報が格納されます。sqld フィールドには、INPUT と OUTPUT 変数の総数が入ります。インジケーター変数内の DT_DESCRIBE_INPUT ビットは INPUT 変数に対して設定され、OUTPUT 変数に対してクリアします。
BIND VARIABLES FOR 句 INPUT 句と同じです。
SELECT LIST FOR 句 OUTPUT 句と同じです。
INPUT 句 バインド変数は、データベースが文を実行するときにアプリケーションによって提供される値です。バインド変数は、文に対するパラメーターと考えることができます。DESCRIBE INPUT は、バインド変数名を使って SQLDA に名前フィールドを格納します。DESCRIBE INPUT は、SQLDA の sqlda フィールドにバインド変数の数も格納します。
DESCRIBE は、SQLDA の中のインジケーター変数を使って情報を追加します。DT_PROCEDURE_IN と DT_PROCEDURE_OUT は、CALL 文を記述するときに、インジケーター変数の中に設定されるビットです。DT_PROCEDURE_IN は IN または INOUT パラメーターを示し、DT_PROCEDURE_OUT は INOUT または OUT パラメーターを示します。プロシージャー RESULT カラムは、両方のビットをクリアします。DESCRIBE OUTPUT の後、これらのビットは結果セットを持っている文 (OPEN、FETCH、RESUME、CLOSE を使用する必要がある) と持っていない文 (EXECUTE を使用する必要がある) を区別するのに使用できます。DESCRIBE INPUT は、バインド変数が CALL 文に対する引数であるときに、適切に DT_PROCEDURE_IN と DT_PROCEDURE_OUT を設定するだけです。CALL 文の引数である式の中のバインド変数は、ビットを設定しません。
OUTPUT 句 DESCRIBE OUTPUT 文は、SQLDA のそれぞれの SELECT リスト項目のデータ型と長さを埋めます。名前フィールドにも、SELECT リスト項目の名前が入ります。SELECT リスト項目に対してエイリアスを指定する場合、名前はそのエイリアスになります。エイリアスを指定しない場合、名前を SELECT リスト項目から取り出します。項目が単純なカラム名である場合は、その名前が使用されます。そうでない場合は、式の部分文字列が使用されます。また、DESCRIBE は、SELECT リスト項目の数を SQLDA の sqld フィールドに格納します。
記述されている文が 2 つ以上の SELECT 文の UNION である場合、DESCRIBE OUTPUT に対して返されるカラム名は、最初の SELECT 文に対して返されるカラム名と同じです。
CALL 文を記述すると、DESCRIBE OUTPUT 文は、プロシージャー中の各 INOUT または OUT パラメーターに対して、SQLDA の中にデータ型、長さ、名前を格納します。DESCRIBE OUTPUT 文は、SQLDA の sqld フィールドの中に INOUT または OUT パラメーターの数も格納します。
結果セットを返す CALL 文を記述すると、DESCRIBE OUTPUT 文は、プロシージャー定義の各 RESULT カラムに対して、SQLDA の中にデータ型、長さ、名前を格納します。DESCRIBE OUTPUT 文は、SQLDA の sqld フィールドの中に結果カラムの数も格納します。
LONG NAMES 句 LONG NAMES 句は、文またはカーソルに対応するカラム名を取得するために用意されています。この句を使用しないと、取得するカラム名の長さは 29 文字に制限されますが、この句を使用すると、任意の長さのカラム名がサポートされます。
LONG NAMES を使用した場合、カーソルからフェッチを行う場合と同様に、長い名前は SQLDA の SQLDATA フィールドに格納されます。これ以外のフィールド (SQLLEN、SQLTYPE など) にはどれも入力されません。SQLDA は FETCH SQLDA のように設定してください。つまり、各カラムには、文字列型のデータのエントリを 1 つ含めます。インジケーター変数がある場合、通常の方法でトランケーションが示されます。
長い名前のデフォルトの仕様は、TABLE.COLUMN です。
WITH VARIABLE RESULT 句 この句は、複数の結果セットと異なる数または型のカラムを持つプロシージャーの記述に使用します。
WITH VARIABLE RESULT を使用する場合、DESCRIBE 文後にデータベースサーバーは SQLCOUNT 値を次のいずれかに設定します。
0 結果セットは変更される場合があります。各 OPEN 文の後でプロシージャーコールを記述し直してください。
1 結果セットは固定です。再度記述する必要はありません。
DESCRIBE 文は指定した SQLDA を設定し、指定した文に対して OUTPUT (SELECT LIST FOR と同等) または INPUT (BIND VARIABLES FOR と同等) を記述します。
INPUT の場合、DESCRIBE BIND VARIABLES は SQLDA の中にデータ型を設定しません。アプリケーションが、データ型を設定する必要があります。ALL キーワードを使うと、1 つの SQLDA の中に INPUT と OUTPUT を記述できます。
文名を指定する場合は、同じ文名で PREPARE 文を使用して、文を事前に作成します。また、事前に SQLDA を割り付けます。
カーソル名を指定する場合、カーソルを事前に宣言し、開いておきます。デフォルトの動作は、OUTPUT です。SELECT 文と CALL 文だけが OUTPUT を持っています。他の文または動的カーソルではないカーソルの DESCRIBE OUTPUT は、SQLDA の sqld フィールドを 0 に設定して出力なしを示します。
Embedded SQL の場合、NCHAR、NVARCHAR、LONG NVARCHAR はそれぞれデフォルトで DT_FIXCHAR、DT_VARCHAR、DT_LONGVARCHAR と記述されます。db_change_nchar_charset 関数が呼び出された場合、これらのデータ型はそれぞれ DT_NFIXCHAR、DT_NVARCHAR、DT_LONGNVARCHAR と記述されます。
なし
なし
SQL/2008 DESCRIBE OUTPUT 文は、SQL/2008 標準のオプションの SQL 言語機能 B031、"Basic dynamic SQL" です。DESCRIBE INPUT 文は、オプションの SQL 言語機能 B032、"Extended dynamic SQL" です。DESCRIBE 文のその他の多くの句は、ベンダー拡張です。これらのコードを以下に示します。
USER TYPES、ALL、BIND VARIABLES FOR、LONG NAMES、WITH VARIABLE RESULT の各句。
DESCRIBE は INTO 句を使用して SQLDA を識別します。SQL/2008 標準では、USING キーワードが代わりに使用されます。
SQL/2008 標準では、CURSOR 句はキーワード STRUCTURE で終了します。STRUCTURE は SQL Anywhere ではサポートされません。
次の例は、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; } |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |