ECPGPlus - Overview¶
</ div>
EDBはECPG( PostgreSQLプリコンパイラ)を拡張してECPGPlusを作成しました。 ECPGPlusは、 PostgreSQL CプリコンパイラのPro * C互換バージョンです。 ECPGPlusは、Cコードと埋め込みSQLステートメントを組み合わせたプログラムを同等のCプログラムに変換します。翻訳を実行する際、ECPGPlusは各SQLコンストラクトの構文が正しいことを確認します。
次の図は、実行可能ファイルにコンパイルされる埋め込みSQLステートメントを含むプログラムのパスを示しています。
Compilation of a program containing embedded SQL statements¶
埋め込みSQLステートメントを含むプログラムのコンパイル
埋め込みSQLステートメントを含むCプログラムから実行可能ファイルを生成するには、プログラム(上図のmy_program.pgc)をECPGPlusプリコンパイラに渡します。
ECPGPlusは、my_program.pgcの各SQLステートメントをecpglib
APIを呼び出すCコードに変換し、Cプログラム(my_program.c)を生成します。次に、CプログラムをCコンパイラに渡します。
Cコンパイラはオブジェクトファイル(my_program.o)を生成します。最後に、オブジェクトファイル(my_program.o)とecpglibライブラリファイル、およびその他の必要なライブラリをリンカに渡し、リンカーが実行可能ファイル(my_program)を生成します。
ECPGPlusプリプロセッサは各SQLステートメントの構文を検証しますが、セマンティクス*を検証することはできません。例、プリプロセッサはINSERTステートメントが構文的に正しいことを確認しますが、INSERTステートメントで言及されているテーブルが実際に存在することは確認できません。
舞台裏
クライアントアプリケーションには、次の要素で構成されるCコードと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には、埋め込みSQL宣言セクションが含まれています。
SQLコード内で参照するC変数は、host variablesと呼ばれます。 Pro
* Cモード(-C PROC)でECPGPlusプリプロセッサを呼び出す場合、
SQLステートメント内の* any *
C変数を参照できます。それ以外の場合は、BEGIN/END DECLARATION SECTIONペア内で各ホスト変数を宣言する必要があります。
行16〜19にはSQLステートメントが含まれています。
SQLステートメントは、ECPGPlusランタイムライブラリの呼び出しに変換されます。
行21から23にはCコードが含まれています。
Cコードは変更せずに出力ファイルにコピーされます。
SQLステートメントには、EXEC 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はAdvanced
ServerインストールウィザードによってDatabase Serverコンポーネントのパートとしてインストールされます。
Linuxでは、edb-asxx-server-devel
RPMパッケージを使用してインストールします。xxは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には、Cで記述されたプログラム(埋め込みSQLを含む)をCプログラムに変換する方法をmakeユーティリティに指示する一連の命令が含まれています。このガイドの例を試すには、次のものが必要です。
Cコンパイラ(およびリンカ)
makeユーティリティECPGPlusプリプロセッサとライブラリ
ECPGPlusの手順を含む
makefile
次のコードは、このガイドに含まれるサンプルのmakefileの例です。サンプルコードを使用するには、ソースコードファイルを含むディレクトリの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プログラムはAdvanced Serverに付属しています。
makeは、Cコンパイラの実行時にCFLAGS変数を使用し、リンカの呼び出し時にLDFLAGSおよびLDLIBSを使用する必要があることを認識しています。
ECPGプログラムは、ECPGランタイムライブラリ(-lecpg)およびlibpqライブラリ(-lpq)にリンクする必要があります。
CFLAGS += $(INCLUDES) -g
LDFLAGS += -g
LDLIBS += $(LIBPATH) -lecpg -lpq
サンプルmakefileは、makeが.pgcまたは.pcファイルをCプログラムに変換make方法を指示します。
makefileの2行は、ソースファイルがコンパイルされるモードを指定します。最初のコンパイルオプションは次のとおりです。
.pgc.c:
* ecpg -c $(INCLUDES) $?
最初のオプションは、コミュニティECPG(ECPGPlus拡張機能なし)を使用して、.pgcで終わるファイル(おそらくECPGソースファイル)を.c(Cプログラム)で終わるファイルに変換する方法をmakeに指示します。
INCLUDES変数の値と.pgcファイルの名前を使用して、-cフラグ(
SQLコードをCに変換するようコンパイラに指示します)でECPGプリコンパイラーを呼び出します。
.pc.c:
* ecpg -C PROC -c $(INCLUDES) $?
2番目のオプションは、ECPGPlus拡張機能を使用して、.pg(ECPGソースファイル)で終わるファイルを.c(Cプログラム)で終わるファイルに変換する方法をmakeに指示します。
-cフラグ(
SQLコードをCに変換するようコンパイラに指示する)と-C PROCフラグ(Pro
*
C互換モードでECPGPlusを使用するようコンパイラに指示する)でECPGプリコンパイラーを呼び出します。
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コマンドラインオプション¶
上記のサンプルmakefileでは、ECPGPlusを呼び出してECPGPlusをPro
*
C互換モードで呼び出すように指定する場合、makeに-Cオプションが含まれています。
コマンドラインに-C
PROCキーワードを含める場合、ECPG構文に加えて、Pro *
Cコマンドライン構文を使用できます。例:
$ ecpg -C PROC INCLUDE=/usr/edb/as14/include acct_update.c
利用可能な他のECPGPlusオプションの完全なリストを表示するには、ECPGPlusインストレーションディレクトリに移動し、次のように入力します。
./ecpg --help
コマンドラインオプションは次のとおりです。
Option |
Description |
|---|---|
-c |
埋め込みSQLコードからCコードを自動的に生成します。 |
-C mode |
-C`オプションを使用して、互換性モードを指定します:<br /> <br /> `INFORMIX <br /> <br /> INFORMIX_SE <br /> <br /> PROC |
-D symbol |
プリプロセッサ* symbol を定義します。<br/> <br /> * PROCモードでコンパイルする場合、-D キーワードはサポートされません。*代わりに、Oracleスタイルの 'DEFINE =' *句を使用してください。 |
-h |
ヘッダファイルを解析します。このオプションにはオプション`'-c'`が含まれます。 |
-i |
システムを解析し、インクルードファイル。 |
-I directory |
*ディレクトリ*で`include`ファイルを検索します。 |
-o outfile |
結果を* outfile *に書き込みます。 |
-r option |
実行時の動作を指定します。 *オプション*は次のいずれかになります。<br/> <br /> no_indicator-インジケーターを使用せず、代わりにNULL値を表すために特別な値を使用します。<br/> <br /> prepare-使用する前にすべてのステートメントを準備します。<br /> <br /> questionmarks-プレースホルダとして質問マークの使用を許可します。<br/> <br /> usebulk-ホスト変数配列で動作する`INSERT`、UPDATE、および`DELETE`ステートメントの一括処理を有効にします。 |
--regression |
リグレッションテストモードで実行します。 |
-t |
トランザクションの`autocommit`をオンにします。 |
-l |
`#line`指示子を無効にします。 |
--help |
ヘルプオプションを表示します。 |
--version |
バージョン情報を出力します。 |
NA |
!!! Note *
ECPGPlusを呼び出すときに出力ファイル名前を指定しない場合、出力ファイル名前は、ファイル名拡張子.pgcを取り除き、ファイル名前に.cを追加することによって作成されます。