ストアドプロシージャとは?
- ストアドプロシージャ (stored procedure) とは、データベースに対する一連の処理をまとめた手続きにして、リレーショナルデータベース管理システムに保存(永続化)したものです。
ストアドプロシージャの作成(プログラム呼出しタイプ)
(1)ストアドが呼び出すCLプログラム作成
CLLESRC SAMP01C
PGM PARM(&IN1 &IN2 &OUT1) DCL VAR(&IN1) TYPE(*CHAR) LEN(10) DCL VAR(&IN2) TYPE(*DEC ) LEN(7 0) DCL VAR(&IN2C) TYPE(*CHAR) LEN(7) DCL VAR(&OUT1) TYPE(*CHAR) LEN(18) /*- -*/ CHGVAR &IN2C &IN2 CHGVAR VAR(%SST(&OUT1 1 10)) VALUE(&IN1) CHGVAR VAR(%SST(&OUT1 11 1)) VALUE('-') CHGVAR VAR(%SST(&OUT1 12 7)) VALUE(&IN2C) ENDPGM
(2)ストアドプロシージャの作成(登録)
iナビからもできるんでしょうけど、コマンドラインから登録します。
① STRSQLコマンドにて、SQLステートメントの入力を開始します。
② DROP PROCEDURE文にて、事前削除(初回登録時は不要です)
DROP PROCEDURE TIGEROBJ/SAMP01C
③CREATE PROCEDURE文にて登録(F4拡張可能)
CREATE PROCEDURE TIGEROBJ/SAMP01C(IN PARM1 CHAR (10 ), IN PARM2 DEC (7 , 0), OUT PARM3 CHAR (18 )) LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL NAME TIGEROBJ/SAMP01C PARAMETER STYLE GENERAL
・パラメータ
- 実行プロシージャ名
- 作成または宣言されるプロシージャーの名前を入力
- RESULT SETS
- プロシージャーから戻すことができる結果セットの最大数を指定。ブランクのままにすると、最大値を指定しないことになる。
- 実行するPGM言語
- 外部プロシージャーが書かれている言語(C, CL, COBOL, COBOLLE,C++, FORTRAN, PLI,REXX, RPG,RPGLE,JAVA,ブランク)
- PARAMETER STYLE
- 行なわれる呼び出しのタイプを識別
№ | タイプ | 内容 |
---|---|---|
01 | GENERAL | ホスト変数は,指定された言語に適切なデータ・タイプに変換される |
02 | GENERAL WITH NULLS | ホスト変数は,指定された言語に適切なデータ・タイプに変換される。標識変数に追加の引き数が渡される |
03 | SQL | ホスト変数は,指定された言語に適切なデータ・タイプに変換される。すべての適用可能なパラメーターが渡される |
04 | JAVA | ストアード・プロシージャーは, JAVA 言語および SQLJルーチン仕様に従ったパラメーター・パス規則を使用 |
05 | DB2GENERAL |
- EXTERNAL NAME
- プロシージャーが呼び出された時に実行されるプログラム
- IS DETERMINISTIC
- 同じ入力引き数をもった後続の呼び出しからプロシージャーが同じ結果を戻すかどうかを選択する
- SQL 使用状況
- プロシージャーが SQL を使用するかどうか
- CALLED ON NULL INPUT
- 入力パラメーターが NULL 値である場合にプロシージャーが呼び出されるかどうか
- SPECIFIC
- プロシージャーを固有に識別する名前を指定できる
- 呼び出しパラメータ
- ・USAGE・・・IN,OUT,INOUT
・データ・タイプ・・・INT,SMALLINT,BIGINT,FLOAT,NUMERIC,DEC,CHAR,CHARACTER VARYING,BINARY,BINARY VARYING,DATE,TIME,TIMESTAMP,GRAPHIC,DOUBLEなど
CREATE PROCEDUREプロンプト画面・例
④登録済みストアドプロシージャの確認方法
・iナビを使用する。 (データベース→データベース指定→スキーマ→ライブラリー指定→プロシージャー)
(3)Javaによるストアド・テスト
import java.sql.*; import java.io.*; class asStoredTest { public static void main (String[] args) { String url = "jdbc:as400://"; String system = "xxx.xxx.xxx.xxx"; String libl = "TIGEROBJ"; String user = "xxxxxx"; String password = "xxxxxxxxx"; Connection con = null; try { // JDBCドライバのロード Class.forName("com.ibm.as400.access.AS400JDBCDriver"); // DB接続 con = DriverManager.getConnection( url + system + ";" + "libraries=" + libl, user, password); // SQLコンテナ作成 String sql = "CALL TIGEROBJ.SAMP01C(?,?,?)"; CallableStatement stmt = con.prepareCall(sql); // SQL実行 stmt.setString(1,args[0]); stmt.setString(2, args[1]); stmt.registerOutParameter(3, Types.CHAR); stmt.executeUpdate(); // 検索結果取り出し System.out.println("ストアド実行結果: " + stmt.getString(3)); stmt.close(); } catch(SQLException e) { while(e != null) { System.out.println("エラー:SQL例外"); System.err.println(e.getMessage()); System.out.println(""); e = e.getNextException(); } } catch(Exception e) { System.out.println("エラー:例外"); e.printStackTrace(); } finally { try { con.close(); } catch(SQLException e) {} } } }
実行結果
c:¥Java>set classpath=".;C:¥Program Files¥IBM¥Client Access¥jt400¥lib¥jt400.jar" c:¥Java>set classpath classpath=".;C:¥Program Files¥IBM¥Client Access¥jt400¥lib¥jt400.jar" c:¥Java>javac asStoredTest.java c:¥Java>java asStoredTest あいうえ 12345 ストアド実行結果: あいうえ-0012345 c:¥Java>java asStoredTest あいうえお 12345 エラー:SQL例外 Descriptor index not valid. (246)