型の値のために明示的にメモリを確保する必要があります。言い換えると、この変数のためのメモリ領域はスタックではなくヒープ上に確保されます。ポインタ宣言を必要とし、ヒープメモリを確保する必要があり、pgtypesライブラリ関数を使って変数にアクセスします。型に対する専用の関数は提供されていません。変数に変換する必要があります。型の変数の処理の例を示します。decimalの値を表示するためdecimalをnumericに変換する。非プリミティブ型のホスト変数ホスト変数として、配列、typedef、構造体およびポインタも使うことができます。配列ホスト変数としての配列の使い方には二通りの利用方法があります。何らかのテキスト文字列を保持するための方法です。二つ目の使い方は、カーソルを用いずに複数行を返却するクエリ結果を受け取るために使う方法です。コマンドを使用する必要があります。配列のホスト変数を使うと、複数行を一括して受け取ることができます。配列の長さはすべての行を受け入れられるように定義されなければなりません。なければバッファーオーバーフローが発生するでしょう。複数行を一度に配列へと取り出す。0;}この例は、以下の結果を表示します。構造体メンバー変数の名前がクエリ結果のカラム名に合致する構造体は、複数のカラムを一括して受け取るために利用することができます。構造体は複数のカラムの値を単一のホスト変数で扱うことを可能にします。以下の例は、pg_databaseシステムテーブルおよびpg_database_size()関数を使って、利用可能なデータベースのOID、名前、サイズを取得します。この例では、メンバー変数の名前がSELECT結果の各カラムに合致する構造体dbinfo_tが、複数のホスト変数に格納することなくFETCH文の一行の結果を受け取るために使用されています。複数列を1つの構造体に取り込む。構造体のメンバを表示する。size=8183012構造体のホスト変数は、多数のカラムを構造体のフィールドとして「吸収」します。追加のカラムは他のホスト変数に割り当てることができます。変数を使って以下のように書き換えることができます。複数列を1つの構造体に取り込む。構造体のメンバを表示する。キーワードを使ってください。long;この宣言は、宣言セクションの一部である必要はありません。ポインタほとんどの一般的な型のポインタを宣言することができます。自動メモリ確保を使わずにクエリのターゲット変数として使うことはできません。本節では、非スカラー型およびユーザ定義のSQLデータ型をECPGアプリケーションで扱う方法を示します。この内容は、前の説で説明した非プリミティブ型のホスト変数の扱い方とは別のものです。配列SQLの多次元配列は、ECPGにおいては直接的にはサポートされていません。SQLの1次元配列をC言語の配列のホスト変数に対応させることはできますし、その逆もできます。文の作成時にはecpgがその列の型を知らないので、C言語の配列を対応するSQLの配列に入力できるか確かめられません。SQL文の出力を処理する時には、ecpgは必要な情報を持っていますので、どちらも配列であるか確かめます。対して個別にアクセスした場合、ECPGにおける配列の利用を避けることができます。その際、要素に対応させることができる型のホスト変数を利用しなければなりません。型のホスト変数を使用することができます。型のホスト変数を使用することができます。...}この場合は正しく動作しません。配列型のカラムをホストの配列変数に直接対応させることはできないからです。型に文字列表現として保存することです。このことは、配列にはホストプログラム内で自然な形ではアクセスできないことを意味しています(文字列表現を解析する追加処理が無ければ)。複合型はECPGでは直接はサポートされていませんが、簡単な回避方法が利用可能です。各属性に個別にアクセスするか、外部の文字列表現を使います。);もっとも分かりやすい解決法は、各属性に個別にアクセスすることです。SELECTリストに複合型の列の各要素を書く。複合型の列の各要素をホスト変数に取り出す。コマンドの値を格納するホスト変数を一つの構造体にまとめることができます。構造体に変更するために、この例は以下のように変更することができます。コマンドで指定します。SELECTリストに複合型の列の各要素を書く。SELECTリストの値をすべて1つの構造体に取り込む。句において各々が指定されています。用いることで拡張することができます。SELECTリストの値をすべて1つの構造体に取り込む。compval.textval.arr);}...この方法であれば、ECPGが複合型そのものを理解できないとしても、複合型はほぼシームレスに構造体に対応させることができます。型のホスト変数に外部の文字列表現として複合型の値を格納することもできます。この方法ではホストプログラムから値のフィールドにアクセスするのは簡単ではありません。新しいユーザ定義の基本型は、ECPGでは直接的にはサポートされていません。型のホスト変数を使うことができ、この解決法は多くの型について確かに適切かつ十分です。ユーザ定義の型に含まれるcomplex型を使った例を示します。ユーザ定義の型のcomplex_in()関数およびcomplex_out()関数で定義されています。以下の例は、カラムaとbに、complex型の値(1,1)および(3,3)を挿入し、その後、それらをテーブルからSELECTします。cur1;この例は、以下の結果を示します。b=(3,3)その他の回避方法は、ユーザ定義型をECPGにおいて直接的に使うことを避けることであり、ユーザ定義型とECPGが扱えるプリミティブ型を変換する関数またはキャストを作成することです。型のキャスト、特に暗黙のものは型システムにおいて慎重に導入されなければなりません。:d));以下と同じ効果をもたらします。上の例ではNULL値を扱いません。実際、取り出し例では、もしデータベースからNULL値が取り出された場合にはエラーが発生します。データベースへNULL値を渡す、または、データベースからNULL値を取り出すためには、第二のホスト変数指定をデータを格納するホスト変数それぞれに追加しなければなりません。第二のホスト変数は指示子と呼ばれ、データがNULLかどうかを表すフラグが含まれます。NULLの場合、実際のホスト変数の値は無視されます。以下に、NULL値の取り出しを正しく扱う例を示します。test1;値がNULLでなければ、指示子変数val_indは0となります。値がNULLならば負の値となります。指示子は他の機能を持ちます。指示子の値が正ならば、値がNULLではありませんが、ホスト変数に格納する際に一部切り詰められたことを示します。