9.3.1 プログラム例
表picsにBLOB型として格納されているデータをSELECT文で検索し,ZIP圧縮してから呼び出し側に返却するストアドプロシジャの例を次に示します。
- ≪Javaストアドプロシジャの定義≫
CREATE PROCEDURE get_pic .............................................1 (IN pic_num INTEGER, OUT pic_data BLOB) ............................1 LANGUAGE JAVA ......................................................2 EXTERNAL NAME 'mypack.jar:JStrPics.getZippedPic(int, byte[][])' ....3 PARAMETER STYLE JAVA; ..............................................4
- [説明]
-
-
プロシジャ名,パラメタの定義
-
LANGUAGEの設定
-
Javaメソッドとの関連づけ
-
PARAMETER STYLEの設定
-
- ≪Javaストアドプロシジャの手続き本体≫
import java.sql.*; import java.io.*; import java.util.zip.*; public class JStrPics{ ...............................................1 public static void getZippedPic(int jpic_num, byte[][] jpic_data) ..2 throws SQLException, IOException{ ................................3 Connection con = DriverManager.getConnection( ....................4 "jdbc:hitachi:hirdb"); ....................4 PreparedStatement pstmt = con.prepareStatement ...................5 ("select p_name,p_data from pics where p_num = ?"); ...........5 pstmt.setInt(1, jpic_num); .......................................5 ResultSet rs = pstmt.executeQuery(); .............................6 String name; .....................................................7 byte[] srcPic; ...................................................7 while(rs.next()){ name = rs.getString("p_name"); .................................8 srcPic = rs.getBytes("p_data"); ................................9 } ByteArrayOutputStream baos = new ByteArrayOutputStream(); ........10 ZipOutputStream zos = new ZipOutputStream(baos); .................10 ByteArrayInputStream bais = new ByteArrayInputStream(srcPic); ....10 ZipEntry ze = new ZipEntry(name); ................................10 zos.putNextEntry(ze); ............................................10 int len = 0; .....................................................10 byte[] buff = new byte[1024]; ....................................10 while((len = bais.read(buff)) != -1){ ............................10 zos.write(buff, 0, len); .........................................10 } ................................................................10 zos.closeEntry(); ................................................11 bais.close(); ....................................................11 zos.close(); .....................................................11 jpic_data[0] = baos.toByteArray(); ...............................12 baos.close(); ....................................................12 return; ..........................................................13 } }
- [説明]
-
-
クラス名の定義
-
メソッド名,パラメタ名の定義
-
例外が発生した場合の定義
-
Connectionオブジェクトの取得(ただし,HiRDB接続ユーザ数が増えるのではなく,Javaストアドプロシジャはコール元の接続内で動作します)
-
SELECT文の前処理
-
SELECT文の実行,結果集合取得
-
変数の宣言
-
結果集合からp_name列の値を取得
-
結果集合からp_data列の値を取得
-
srcPic配列内のデータをZIP形式で圧縮し,zosストリーム内に格納
-
入力,出力ストリームのクローズ
-
baosストリーム内のbyte列を,メソッドのOUTパラメタに設定
-
メソッド実行の終了
-
- ≪Javaストアドプロシジャの実行≫
import java.sql.*; import java.io.* ; public class Caller{ ...................................................1 public static void main(String[] args) ...............................2 throws SQLException, IOException{ ..................................3 Connection con = DriverManager.getConnection( ......................4 "jdbc:hitachi:hirdb”,”USER1”,”PASS1"); ............4 CallableStatement cstmt = con.prepareCall("{call get_pic(?,?)}"); ..5 cstmt.setInt(1, 10); ...............................................5 cstmt.registerOutParameter(2, java.sql.Types.LONGVARBINARY); .......5 cstmt.executeUpdate(); .............................................6 byte[] getPic = cstmt.getBytes(2); .................................7 ...... } }
- [説明]
-
Javaストアドプロシジャを呼び出すJavaアプリケーションのプログラム例です。
-
クラス名の定義
-
メソッド名,パラメタ名の定義
-
例外が発生した場合の定義
-
Connectionオブジェクトの取得(このConnectionオブジェクトを取得することで,HiRDBに接続するため,ユーザ数が増えます)
-
CALL文の前処理
-
CALL文の実行
-
byte配列型のOUTパラメタの取得
-