<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) 実行プログラム コンパイル & リンク バインド ファイル (prog1.bnd) db2 bind prog1.bnd データベース パッケージ (PROG1) 3 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
構造体を使用したフェッチ 構造体の生成 ( コマンド ) 構造体を使用したフェッチ (.sqc ファイル ) $ 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; short ind_employee[14]; EXEC SQL END DECLARE SECTION; 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; 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; int main() #include "sqlca.h" extern struct sqlca sqlca; int xxx() #include "sqlca.h" #include "sqlca.h" int func1() int func3() struct sqlca sqlca;. struct sqlca sqlca; }. } int func2() int func4() struct sqlca sqlca;. struct sqlca sqlca; }. } 9 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