ECPGPlus overview¶
ECPGPlusを作成するためのEDB拡張ECPG(PostgreSQLプリコンパイラ)。 ECPGPlusは、PostgreSQL CプリコンパイラのPro*C互換バージョンです。 ECPGPlusは、Cコードと埋め込みSQLステートメントを組み合わせたプログラムを同等のCプログラムに変換します。変換を実行するときに、ECPGPlusは各SQLコンストラクトの構文が正しいことを確認します。
次の図は、実行可能ファイルにコンパイルされるときの埋め込みSQLステートメントを含むプログラムのパスを示しています。
Compilation of a program containing embedded SQL statements¶
埋め込みSQL文を含むプログラムのコンパイル
埋め込みSQLステートメントを含むCプログラムから実行可能ファイルを生成するには:
1.プログラム(図のmy_program.pgc
)をECPGPlusプリコンパイラーに渡します。 ECPGPlusは、 my_program.pgc
の各SQLステートメントを、 ecpglib
APIを呼び出してCプログラム(my_program.c
)を生成するCコードに変換します。
CプログラムをCコンパイラに渡します。 Cコンパイラは、オブジェクトファイル(
my_program.o)を生成します。
1.オブジェクトファイル(my_program.o )、ecpglib
ライブラリファイル、およびその他の必要なライブラリをリンカーに渡します。リンカーは実行可能ファイル(my_program
)を生成します。
ECPGPlusプリプロセッサは各SQLステートメントの構文を検証しますが、セマンティクスは検証できません。たとえば、プリプロセッサはINSERT
ステートメントが構文的に正しいことを確認しますが、 INSERT
ステートメントで指定されたテーブルが存在することを確認できません。
舞台裏¶
クライアントアプリケーションには、次の要素で構成されるCコードとSQLコードが混在していSQL。
Cプリプロセッサ指示子
C宣言(変数、型、関数など)
C定義(変数、型、関数など)
SQLプリプロセッサ指示子
SQLステートメント
例:
1 #include <stdio.h>
2 EXEC SQL INCLUDE sqlca;
3
4 extern void printInt(char *label, int val);
5 extern void printStr(char *label, char *val);
6 extern void printFloat(char *label, float val);
7
8 void displayCustomer(int custNumber)
9 {
10 EXEC SQL BEGIN DECLARE SECTION;
11 VARCHAR custName[50];
12 float custBalance;
13 int custID = custNumber;
14 EXEC SQL END DECLARE SECTION;
15
16 EXEC SQL SELECT name, balance
17 INTO :custName, :custBalance
18 FROM customer
19 WHERE id = :custID;
20
21 printInt("ID", custID);
22 printStr("Name", custName);
23 printFloat("Balance", custBalance);
24 }
このコードフラグメントでは:
1行目はCプリプロセッサへの指示子を指定します。
C
プリプロセッサ指示子は、解釈または無視できます。このオプションは、ECPGPlusを呼び出すときに入力されるコマンドラインオプション(-C PROC
)によって制御されます。いずれの場合も、
ECPGPlusは各Cプリプロセッサ指示子を変更なしで出力ファイル(4)にコピーします。ソースファイルで見つかったCプリプロセッサ指示子は、出力ファイルに表示されます。
2行目は、 SQLプリプロセッサへの指示を指定します。
SQLプリプロセッサ指示子はECPGPlusプリプロセッサによって解釈され、出力ファイルにコピーされません。
4〜6行目はC宣言を含みます。
C宣言は、各VARCHAR 宣言が同等のstruct
宣言に変換されることを除き、変更なしで出力ファイルにコピーされます。
・ 10~14行目は、embedded- SQLの宣言部です。
SQLコードで参照するC変数は、ホスト変数と呼ばれます。
ECPGPlusプリプロセッサをPro*Cモード(-C PROC )で呼び出すと、
SQL文でC変数を参照できます。それ以外の場合は、各ホスト変数をBEGIN/END DECLARATION SECTION
ペアで宣言する必要があります。
・ 16~19行目はSQL文です。
SQLステートメントは、ECPGPlusランタイムライブラリへの呼び出しに変換されます。
・21~23行目はCコードです。
Cコードは変更なしで出力ファイルにコピーされます。
任意のSQLステートメントにEXEC SQL をプレフィックスします。
SQLステートメントは、次の (引用符で囲まない)
セミコロンまで拡張されます。例:
printf(“Updating employee salaries\n”);
EXEC SQL UPDATE emp SET sal = sal * 1.25;
EXEC SQL COMMIT;
printf(“Employee salaries updated\n”);
プリプロセッサはこのコードフラグメントを検出すると、Cコード(最初の行と最後の行)を変換せずに出力ファイルに渡し、各
EXEC SQL ステートメントをecpglib
ファンクションへの呼び出しに変換します。結果は次のようになります。
printf("Updating employee salaries\n");
{
ECPGdo( __LINE__, 0, 1, NULL, 0, ECPGst_normal,
"update emp set sal = sal * 1.25",
ECPGt_EOIT, ECPGt_EORT);
}
{
ECPGtrans(__LINE__, NULL, "commit");
}
printf(“Employee salaries updated\n”);
インストールと構成¶
Windows、 ECPGPlusはEDB Postgres Advanced
ServerインストールウィザードによってDatabase
Serverコンポーネントの一部としてインストールされます。 Linuxでは、
edb-asxx-server-devel RPMパッケージでインストールします。ここで、
xx はEDB Postgres Advanced
Serverのバージョン番号です。デフォルトでは、実行可能ファイルはWindows上の次の場所にあります。
C:\Program Files\edb\as14\bin
Linuxでは、次の場所にあります。
/usr/edb/as14/bin
ECPGPlusコンパイラを呼び出すとき、実行可能ファイルは検索パス(
Windowsでは %PATH% 、Linuxでは $PATH
)にある必要があります。たとえば、次のコマンドは、ECPGPlus実行ファイルecpg
を保持するディレクトリを含むように検索パスを設定します。
Windows:
set EDB_PATH=C:\Program Files\edb\as14\bin
set PATH=%EDB_PATH%;%PATH%
Linuxの場合:
export EDB_PATH==/usr/edb/as14/bin
export PATH=$EDB_PATH:$PATH
makefileの作成¶
makefileには、埋め込みSQLを含むCで記述されたプログラムをCプログラムに変換する方法をmakeユーティリティに指示する一連の命令が含まれています。例を試すには、次のものが必要です。
Cコンパイラ(およびリンカ)
makeユーティリティ
ECPGPlusプリプロセッサとライブラリ
ECPGPlusの指示を含むmakeファイル
次のコードは、このドキュメントに含まれるサンプルのメイクファイルの例です。サンプルコードを使用するには、ソースコードファイルが含まれるディレクトリにある
makefile という名前のファイルに保存します。
INCLUDES = -I$(shell pg_config --includedir)
LIBPATH = -L $(shell pg_config --libdir)
CFLAGS += $(INCLUDES) -g
LDFLAGS += -g
LDLIBS += $(LIBPATH) -lecpg -lpq
.SUFFIXES: .pgc,.pc
.pgc.c:
ecpg -c $(INCLUDES) $?
.pc.c:
ecpg -C PROC -c $(INCLUDES) $?
最初の2行では、 pg_config
プログラムを使用して、必要なヘッダーファイルとライブラリディレクトリを見つけます。
INCLUDES = -I$(shell pg_config --includedir)
LIBPATH = -L $(shell pg_config --libdir)
pg_config プログラムはEDB Postgres Advanced
Serverに同梱されています。
makeは、Cコンパイラの実行時にCFLAGS
変数を使用し、リンカーを呼び出すときにLDFLAGS およびLDLIBS
を使用することを知っています。
ECPGプログラムは、ECPGランタイムライブラリ(-lecpg
)およびlibpqライブラリ(-lpq )に対してリンクする必要があります。
CFLAGS += $(INCLUDES) -g
LDFLAGS += -g
LDLIBS += $(LIBPATH) -lecpg -lpq
サンプルmakeファイルは、 .pgc または.pc
ファイルをCプログラムに変換する方法をmakeに示しています。
makefileの2行は、ソースファイルのコンパイルモードを指定します。最初のコンパイルオプションは次のとおりです。
.pgc.c:
ecpg -c $(INCLUDES) $?
最初のオプションは、
ECPGPlusの拡張機能なしで、コミュニティECPGを使用して、 .pgc
(おそらくECPGソースファイル)で終わるファイルを.c
(Cプログラム)で終わるファイルに変換する方法を指示します。これは、
INCLUDES 変数の値と.pgc ファイルの名前を使用して、
SQLコードをCに変換するようにコンパイラーに指示します。
.pc.c:
ecpg -C PROC -c $(INCLUDES) $?
2番目のオプションは、 ECPGPlus拡張機能を使用して、 .pg
(ECPGソースファイル)で終わるファイルを .c (Cプログラム)
で終わるファイルに変換する方法を指示します。 -c
フラグを使用してECPGプリコンパイラーを呼び出し、
SQLコードをCに変換するようにコンパイラーに指示します。また、 -C PROC
フラグを使用して、 INCLUDES 変数と.pgc ファイルの名前。
makeを実行するときに、コンパイルするECPGソースコードファイルの名前を渡します。たとえば、
customer_list.pgc
という名前のECPGソースコードファイルをコンパイルするには、次のコマンドを使用します。
make customer_list
makeユーティリティ:
現在のディレクトリにあるmakefileを調べます。
makefileに
customer_list.pgcをCプログラム(customer_list.c)にコンパイルするルールが含まれていることを発見します。makeに組み込まれたルールを使用して、customer_list.cを実行可能プログラムにコンパイルします。
ECPGPlusのコマンドラインオプション¶
サンプルmakeファイルでは、ECPGPlusを呼び出してPro*C互換モードでECPGPlusを呼び出すときに、makeに-C
オプションが含まれます。
ECPG構文に加えて、コマンドラインで-C PROC
キーワードを含めると、Pro*Cコマンドライン構文を使用できます。例:
$ ecpg -C PROC INCLUDE=/usr/edb/as14/include acct_update.c
使用可能な他のECPGPlusオプションの完全なリストを表示するには、ECPGPlusインストールディレクトリで次のように入力します。
./ecpg --help
コマンドラインオプションは次のとおりです。
Option |
Description |
|---|---|
-c |
Embedded SQLコードからCコードを自動生成します。 |
-C mode |
-C`オプションを使用して、互換性モードを指定します。<br /><br />`INFORMIX`<br /><br />`INFORMIX_SE`<br /><br />`PROC |
-D symbol |
プリプロセッサ*シンボル*を定義します。<br /><br />*PROCモード*でコンパイルする場合、-D*キーワードはサポートされていません。代わりに、Oracleスタイルの'DEFINE='*句を使用します。 |
-h |
ヘッダーファイルを解析します。このオプションにはオプション`'-c'`が含まれます。 |
-i |
パースシステム、インクルードファイルも。 |
-I directory |
`include`ファイルを*ディレクトリ*で検索します。 |
-o outfile |
結果を*outfile*に書き込みます。 |
-r option |
実行時の動作を指定します。 option: br /><br />`questionmarks` - プレースホルダーとしての疑問符の使用を許可します。<br /><br />`usebulk` - ホスト変数配列で動作する`INSERT`、UPDATE、および`DELETE`ステートメントの一括処理を有効にします。 |
--regression |
リグレッションテストモードで実行します。 |
-t |
トランザクションの`autocommit`をオンにします。 |
-l |
`#line`指示子を無効にします。 |
--help |
ヘルプオプションを表示します。 |
--version |
バージョン情報を出力します。 |
注釈
ECPGPlusを呼び出すときに出力ファイル名を指定しない場合、出力ファイル名はファイル名から`.pgc` 拡張子を削除し、.c を追加することによって作成されます。