読者です 読者をやめる 読者になる 読者になる

タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】SQL-ストアドプロシージャ

ストアドプロシージャとは?

ストアドプロシージャの作成(プログラム呼出しタイプ)

(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
行なわれる呼び出しのタイプを識別
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プロンプト画面・例

f:id:no14141:20131017172157j:plain

f:id:no14141:20131017172433j:plain

f:id:no14141:20131017172508j:plain

④登録済みストアドプロシージャの確認方法
・iナビを使用する。
(データベース→データベース指定→スキーマ→ライブラリー指定→プロシージャー)

f:id:no14141:20131017172527j:plain

(3)Javaによるストアド・テスト

C:¥Java¥asStoredTest.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)