Comments
Description
Transcript
開発編第5章補足 DB2組み込みSQL
<2011年06月> 開発編第5章補足 DB2組み込みSQL 本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布されるものです。 この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合する 使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまたは同 様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。 © Copyright IBM Japan Systems Engineering Co., Ltd. 2009 内容 • 組み込みSQL開発の流れ(例: C言語) • プリコンパイル・オプション • パッケージ名の照会と削除 • データのフェッチ • 構造体を使用したデータのフェッチ • SQLCODEによるSQLの戻りコードの処理 • エラー処理に使用するSQLCAの宣言 • 最初の数レコードを取得 • ハンズオンプログラム概要 • 参考情報 • DB2に付属の組み込みSQLサンプルプログラム (例:C言語の場合) • DB2の情報(Information Center) 2 © 2009 ISE Corporation 組み込みSQL開発の流れ(例: C言語) sqcソース・ファイル(prog1.sqc) db2 prep prog1.sqc bindfile db2 prep prog1.sqc C言語ソース・ファイル(prog1.c) コンパイル&リンク 実行プログラム db2 bind prog1.bnd バインド・ファイル(prog1.bnd) 3 パッケージ (PROG1) データベース © 2009 ISE Corporation プリコンパイル・オプション • コマンド名は、PRECOMPILE または PREP • さまざまなオプションがある(分離レベルの設定など) • 詳細は以下参照 http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com. ibm.db2.luw.admin.cmd.doc/doc/r0001964.html?resultof=%22 %70%72%65%63%6f%6d%70%69%6c%65%22%20 • パッケージ名を8文字より長い値にする場合、package using xxx を 指定 • db2 prep prog1.sqc package using xxx • パッケージ名をxxxにしてDBに登録します • db2 prep prog1.sqc bindfile package using xxx • 上記に加え、バインド・ファイルも作成します 4 © 2009 ISE Corporation パッケージ名の照会と削除 • パッケージ名の照会 • LIST PACKAGES • db2 list packages • SYSCAT.PACKAGESビュー • 例 • db2 select pkgname from syscat.packages where pkgschema='DB2INST1' • パッケージの削除 • DROP PACKAGE [パッケージ名] 5 © 2009 ISE Corporation データのフェッチ EXEC SQL BEGIN DECLARE SECTION; char empno[7]; char first_name[13]; char last_name[16]; … EXEC SQL END DECLARE SECTION; … EXEC SQL CONNECT TO :dbname USER :user USING :password; EXEC SQL DECLARE cur CURSOR FOR select empno,firstnme,lastname,… from employee; EXEC SQL OPEN cur; for (;;) { EXEC SQL FETCH cur INTO :empno, :first_name, :last_name, … 6 © 2009 ISE Corporation 構造体を使用したフェッチ 構造体の生成(コマンド) $ db2dclgn -d sample -t employee -i -l c $ cat employee.h EXEC SQL BEGIN DECLARE SECTION; struct { char empno[7]; struct { short length; char data[12]; } firstnme; char midinit[2]; struct { short length; char data[15]; } lastname; char workdept[4]; … } employee; 構造体を使用したフェッチ(.sqcファイル) EXEC SQL INCLUDE 'employee.h'; … EXEC SQL CONNECT TO :dbname USER :user USING :password; EXEC SQL DECLARE cur CURSOR FOR select empno,firstnme,lastname,… from employee; EXEC SQL OPEN cur; for (;;) { EXEC SQL FETCH cur INTO :employee :ind_employee; short ind_employee[14]; EXEC SQL END DECLARE SECTION; 7 © 2009 ISE Corporation SQLCODEによるSQLの戻りコードの処理 • SQLCODEの値 • SQLCODE=0, SQLWARN0=ブランク: 成功 • SQLCODE=100: データが見つかりませんでした • SQLCODE>0で100以外: 警告付きで成功 • SQLCODE<0: 失敗 • デフォルトでプリコンパイルした場合 • #define SQLCODE sqlca.sqlcode sqlcaの宣言が必要 8 © 2009 ISE Corporation エラー処理に使用するSQLCAの宣言 • プリコンパイラによるエラー処理コードの生成 • struct sqlca sqlca が宣言されていることを前提に生成 • グローバル宣言 ローカル宣言(マルチスレッド対応) EXEC SQL INCLUDE SQLCA; #include "sqlca.h" #include "sqlca.h" int main() { … int func1() { int func3() {struct sqlca sqlca; ….struct sqlca sqlca; …. } } #include "sqlca.h" extern struct sqlca sqlca; int xxx() { … 9 • int func2() { int func4() {struct sqlca sqlca; ….struct sqlca sqlca; …. } } © 2009 ISE Corporation 最初の数レコードを取得 • Oracle • select xxx from xxx where rownum <= x • DB2 • rownumもDB2互換フィーチャーにより使用可能 • db2set DB2_COMPATIBILITY_VECTOR=ORA • rownumの使用は、DB2の再起動で有効 • 無効時は、以下のエラー • SQL0206N 使用されているコンテキストで、"ROWNUM" は無効で す。 SQLSTATE=42703 • 互換フィーチャー未使用時、以下を使用 • select xxx from xxx fetch first x rows only 10 © 2009 ISE Corporation ハンズオン概要 • 2つのOracle用ソース・ファイル • lab5d_ora.pc • 社員情報の取得(静的SQL) • select empno,firstnme,lastname,salary,deptname,location from employee,department where employee.workdept=department.deptno and rownum <= 10 order by salary desc • 社員番号を入力し、該当する社員の名前と誕生日を取得(動的SQL) • select firstnme, birthdate from employee where empno=xxx • lab5d_ora_err.pc • 2つのAPI • SqlErrorTerminate: エラー表示後、ロールバックし、プログラム終了 • SqlErrorDisplay: エラー表示のみ • 上記のソース・ファイルをコピーして、DB2用に修正し、プログラム実 行 • lab5d_db2.sqc • lab5d_db2_err.sqc 11 © 2009 ISE Corporation DB2に付属の組み込みSQLサンプルプログラム (例:C言語の場合) • サンプルプログラムが保存されているディレクトリ • sqllib/samples/c • ビルド関連ファイル • bldapp [プログラム名] [DB名] [ユーザー名] [パスワード] • プログラム名は、.sqcの拡張子を除いた名前(例: tbsel.sqcの場合、tbsel) • DB名、ユーザー名、パスワードは省略可能。DB名は省略時、SAMPLEデータベースに接続。 • bldappバッチファイルで以下のことを行う • • embprepバッチファイルを呼び出す • embprepでは、プリコンパイルを行い、パッケージをDBに生成する プリコンパイルして生成されたCのプログラムのコンパイル&リンクを行う • makefile • 上記bldappバッチファイルの呼び出し等 • 第1引数にプログラム名等が指定可能(詳細はmakefile内の記述参照) • DB名の変更やユーザー名、パスワードの指定は、makefile内の該当箇所に記述 • ALIAS=, UID=, PWD= • さまざまなサンプルが提供されている。詳細は以下を参照 • http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.sampt op.doc/doc/r0007615.html?resultof=%22%74%62%73%65%6c%22%20 12 © 2009 ISE Corporation DB2の情報(Information Center) http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp 検索で表示した ページの目次表示 検索 13 © 2009 ISE Corporation Let’s go to Lab5d!! 14 © 2009 ISE Corporation