...

開発編第5章補足 DB2組み込みSQL

by user

on
Category: Documents
67

views

Report

Comments

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
Fly UP