スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
指定した年月のカレンダーを取得するJavaストアドプロシジャの例です。
/* ALL RIGHTS RESERVED,COPYRIGHT (C)2000,HITACHI,LTD. */
/* LICENSED MATERIAL OF HITACHI,LTD. */
/************************************************************************/
/* name = HiRDB 06-00 Javaストアドプロシジャ サンプルプログラム 1 */
/************************************************************************/
import java.lang.*;
import java.util.*;
/************************************************************************/
/* name = サンプル1 クラス */
/************************************************************************/
public class sample1 {
/*==================================================================*/
/* name = デバッグ用メインメソッド */
/*==================================================================*/
public static void main(java.lang.String[] args) {
java.lang.Integer year = new Integer(args[0]);
java.lang.Integer month = new Integer(args[1]);
java.lang.String calendar[] = new String[1];
calendar(year, month, calendar);
System.out.println(calendar[0]);
}
/*====================================================================*/
/* name = サンプル1 メソッド */
/*====================================================================*/
public static void calendar(java.lang.Integer year,
java.lang.Integer month,
java.lang.String[] calendar) {
int DayOfWeek; // 指定月の1日の曜日
int week; // 改行制御用
int wyear = year.intValue(); // 年ワーク
int wmonth = month.intValue(); // 月ワーク
// カレンダーヘッダ作成
calendar[0] = " " + wyear + " / " + wmonth + "\n";
calendar[0] += "Sun Mon Thu Wed Tue Fri Sat\n";
// カレンダーオブジェクト生成
Calendar target_cal = new GregorianCalendar(wyear, wmonth - 1, 1);
// 指定月の1日の曜日算出
DayOfWeek = target_cal.get(Calendar.DAY_OF_WEEK);
// 開始曜日まで空白設定
for (week = 1; week < DayOfWeek; week++) {
calendar[0] += " ";
}
// 日付設定
for (;
target_cal.get(Calendar.MONTH) == wmonth - 1;
target_cal.add(Calendar.DATE, 1), week++) {
// 日付設定と桁数に応じたスペース調整
if (target_cal.get(Calendar.DATE) < 10) {
calendar[0] += " " + target_cal.get(Calendar.DATE);
} else {
calendar[0] += " " + target_cal.get(Calendar.DATE);
}
// 日付間のパディング文字の設定
if (week == 7) {
calendar[0] += "\n";
week = 0;
} else {
calendar[0] += " ";
}
}
return;
}
}
|
上記の外部Java手続き本体を使用して,Javaストアドプロシジャを定義,実行する例を次に示します。
javac sample1.java |
jar -cvf sample1.jar sample1.class |
INSTALL JAR 'sample1.jar' ; |
CREATE PROCEDURE calendar(IN pyear INT, IN pmonth INT, OUT calendar VARCHAR(255))
LANGUAGE JAVA
EXTERNAL NAME 'sample1.jar:sample1.calendar(java.lang.Integer, java.lang.Integer,
java.lang.String[]) returns void'
PARAMETER STYLE JAVA
end_proc;
|
CALL calendar(?,?,?) |
処理する範囲を年月日で指定し,その範囲のgoods_no列に対応した合計数を更新する例です。
なお,表は次のように定義されているものとします。
CREATE TABLE master_t1 (goods_no int,total_quantity dec(17,2)) CREATE TABLE tran_t1(goods_no int,quantity_1 dec(17,2),entrydate date)
/* ALL RIGHTS RESERVED,COPYRIGHT (C)2000,HITACHI,LTD. */
/* LICENSED MATERIAL OF HITACHI,LTD. */
/************************************************************************/
/* name = HiRDB 06-00 Javaストアド サンプル2 */
/************************************************************************/
import java.lang.*;
import java.math.*;
import java.sql.*;
/************************************************************************/
/* name = サンプル2クラス */
/************************************************************************/
public class sample2 {
/*==================================================================*/
/* name = デバッグ用メインメソッド */
/*==================================================================*/
public static void main(String args[]) throws SQLException {
java.sql.Date fromdate = Date.valueOf("1996-06-01");
java.sql.Date todate = Date.valueOf("1996-06-30");
try {
// Driverクラスの登録
Class.forName("JP.co.Hitachi.soft.HiRDB.JDBC.HiRDBDriver");
} catch (ClassNotFoundException ex) {
System.out.println("\n*** ClassNotFoundException caught ***\n");
ex.printStackTrace();
System.out.println ("");
System.out.println("\n*************************************\n");
return;
}
jproc1(fromdate, todate);
}
/*==================================================================*/
/* name = サンプル2メソッド */
/*==================================================================*/
public static void jproc1(java.sql.Date fromdate, java.sql.Date todate)
throws SQLException {
java.lang.Integer x_goods_no;
java.math.BigDecimal x_quantity_1, x_total_quantity;
try {
// コネクトオブジェクト生成(Java手続き内ではCONNECTは発行されない)
java.sql.Connection con =
DriverManager.getConnection("jdbc:hitachi:hirdb");
con.setAutoCommit(false); // 自動コミットの抑止
// SELECT(stmt1)前処理
java.sql.PreparedStatement stmt1 =
con.prepareStatement("SELECT goods_no, quantity_1, entrydate FROM tran_t1
WHERE entrydate BETWEEN ? AND ? ORDER BY entrydate");
// SELECT(stmt2)前処理(ループの外で前処理しておく)
java.sql.PreparedStatement stmt2 =
con.prepareStatement("SELECT total_quantity FROM master_t1
WHERE goods_no = ?");
// INSERT(stmt3)前処理(ループの外で前処理しておく)
java.sql.PreparedStatement stmt3 =
con.prepareStatement("INSERT INTO master_t1 VALUES(?, ?)");
// UPDATE(stmt4)前処理(ループの外で前処理しておく)
java.sql.PreparedStatement stmt4 =
con.prepareStatement("UPDATE master_t1 SET total_quantity = ?
WHERE goods_no = ?");
// SELECT(stmt1)入力パラメタ設定
stmt1.setDate(1, fromdate);
stmt1.setDate(2, todate);
// SELECT(stmt1)実行
java.sql.ResultSet rs1 = stmt1.executeQuery();
while (rs1.next()) {
// SELECT(stmt1)検索結果取得
x_goods_no = (Integer)rs1.getObject("goods_no");
x_quantity_1 = rs1.getBigDecimal("quantity_1");
// SELECT(stmt2)入力パラメタ設定
stmt2.setObject(1, x_goods_no);
// SELECT(stmt2)実行
java.sql.ResultSet rs2 = stmt2.executeQuery();
// goods_noが登録済/未登録で処理分け
if (!rs2.next()) { // 未登録==>新規エントリ追加
// 更新前にSELECT(stmt2)カーソルクローズ
rs2.close();
// INSERT(stmt3)入力パラメタ設定
stmt3.setObject(1, x_goods_no);
stmt3.setBigDecimal(2, x_quantity_1);
// INSERT(stmt3)実行
stmt3.executeUpdate();
} else { // 登録済==>既存エントリ更新
// 現在値取得
x_total_quantity = rs2.getBigDecimal("total_quantity");
// 増分
x_total_quantity = x_total_quantity.add(x_quantity_1);
// 更新前にSELECT(stmt2)カーソルクローズ
rs2.close();
// UPDATE(stmt4)入力パラメタ設定
stmt4.setBigDecimal(1, x_total_quantity);
stmt4.setObject(2, x_goods_no);
stmt4.executeUpdate() ;
}
}
// SELECT(stmt1)カーソルクローズ
rs1.close();
// 各ステートメントオブジェクト解放
stmt1.close();
stmt2.close();
stmt3.close();
stmt3.close();
// コネクション切断
con.close();
} catch (SQLException ex) { // SQLエラー処理
SQLException fast_ex = ex;
System.out.println("\n***** SQLException caught *****\n");
while (ex != null) {
System.out.println ("SQLState: " + ex.getSQLState ());
System.out.println ("Message: " + ex.getMessage ());
System.out.println ("Vendor: " + ex.getErrorCode ());
ex.printStackTrace();
ex = ex.getNextException ();
System.out.println ("");
}
System.out.println("*******************************\n");
throw fast_ex;
}
return;
}
}
|
上記の外部Java手続き本体を使用して,Javaストアドプロシジャを定義,実行する例を次に示します。
javac sample2.java |
jar -cvf sample2.jar sample2.class |
INSTALL JAR 'sample2.jar' ; |
CREATE PROCEDURE jproc1(IN fromdate DATE, IN todate DATE)
LANGUAGE JAVA
EXTERNAL NAME 'sample2.jar:sample2.jproc1(java.sql.Date, java.sql.Date)
returns void'
PARAMETER STYLE JAVA
end_proc;
|
CALL jproc1(IN ?,IN ?) |
gzip,ungzipを使用して,BLOB型データを圧縮,伸長する例です。
/* ALL RIGHTS RESERVED,COPYRIGHT (C)2000,HITACHI,LTD. */
/* LICENSED MATERIAL OF HITACHI,LTD. */
/************************************************************************/
/* name = HiRDB 06-00 Javaストアド サンプル3 */
/************************************************************************/
import java.util.zip.*;
import java.io.*;
public class sample3 {
private final static int BUFF_SIZE = 4096;
/*==================================================================*/
/* name = デバッグ用メインメソッド */
/*==================================================================*/
public static void main(String[] args) throws IOException {
// 入力データ取得
String sin = args[0];
byte[] bin = args[0].getBytes();
System.out.println("input data : " + sin);
// GZIP(BLOB)
byte[] bwork = gzip(bin);
System.out.println("gzip(BLOB) : " +
bin.length + "=>" + bwork.length +
"(" + (bwork.length * 100 / bin.length) + "%): " +
"");
// GUNZIP(BLOB)
byte[] bout = gunzip(bwork);
System.out.println("gunzip(BLOB): " +
bwork.length + "=>" + bout.length +
"(" + (bout.length * 100 / bwork.length) + "%): " +
new String(bout));
return;
}
/*==================================================================*/
/* name = サンプル3メソッド[gzip(BLOB)] */
/*==================================================================*/
public static byte[] gzip(byte indata[]) {
// 圧縮データ出力用のストリーム生成
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 圧縮データ出力
try {
GZIPOutputStream zos = new GZIPOutputStream(baos);
zos.write(indata, 0, indata.length);
zos.close();
baos.close();
} catch (IOException ex) {
System.out.println("gzip(BLOB): IOException: " + ex);
ex.printStackTrace();
}
// 返却値の圧縮後バイト配列生成
byte[] outdata = baos.toByteArray();
return outdata;
}
/*==================================================================*/
/* name = サンプル3メソッド[gunzip(BLOB)] */
/*==================================================================*/
public static byte[] gunzip(byte[] indata) {
int rlen; // 入出力実長
byte[] buff = new byte[BUFF_SIZE]; // 入出力用バッファ
// 圧縮データ入力用のストリーム生成
ByteArrayInputStream bais = new ByteArrayInputStream(indata);
// 伸長データ出力用のストリーム生成
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 圧縮データ入力・伸長データ出力
try {
GZIPInputStream zis = new GZIPInputStream(bais);
while ((rlen = zis.read(buff, 0, buff.length)) >= 0) {
baos.write(buff, 0, rlen);
}
zis.close();
bais.close();
baos.close();
} catch (IOException ex) {
System.out.println("gunzip(BLOB): IOException: " + ex);
ex.printStackTrace();
}
// 返却値の伸長後バイト配列生成
byte[] outdata = baos.toByteArray();
return outdata;
}
}
|
上記の外部Java関数本体を使用して,Javaストアドファンクションを定義,実行する例を次に示します。
javac sample3.java |
jar -cvf sample3.jar sample3.class |
INSTALL JAR 'sample3.jar' ; |
CREATE FUNCTION gzip(indata BLOB(1M)) RETURNS BLOB(1M) LANGUAGE JAVA EXTERNAL NAME 'sample3.jar:sample3.gzip(byte[]) returns byte[]' PARAMETER STYLE JAVA end_proc; CREATE FUNCTION gunzip(indata BLOB(1M)) RETURNS BLOB(1M) LANGUAGE JAVA EXTERNAL NAME 'sample3.jar:sample3.gunzip(byte[]) returns byte[]' PARAMETER STYLE JAVA end_proc; |
INSERT INTO t1 values(10, ?, gzip(? AS BLOB(1M)))
:
SELECT c1, c2, gunzip(c3), length(c2), length(c3) from t1
|
動的結果集合を使用して,2表の検索した結果を返す例です。
/* ALL RIGHTS RESERVED,COPYRIGHT (C)2000,HITACHI,LTD. */
/* LICENSED MATERIAL OF HITACHI,LTD. */
/************************************************************************/
/* name = HiRDB 06-00 Javaストアド Result Set 導通用ジョブ */
/************************************************************************/
import java.lang.*;
import java.math.*;
import java.sql.*;
/************************************************************************/
/* name = Result Set 導通用クラス(プロシジャ側) */
/************************************************************************/
public class sample4rs {
/*==================================================================*/
/* name = デバッグ用メインメソッド */
/*==================================================================*/
public static void main(String args[]) throws SQLException {
java.lang.Integer p1 = new Integer(10);
int[] cr_cnt = null;
java.sql.ResultSet[] rs1 = null;
java.sql.ResultSet[] rs2 = null;
try {
// Driverクラスの登録
Class.forName("JP.co.Hitachi.soft.HiRDB.JDBC.HiRDBDriver");
} catch (ClassNotFoundException ex) {
System.out.println("\n***** ClassNotFoundException caught *****\n");
ex.printStackTrace();
System.out.println ("");
System.out.println("*******************************\n");
return;
}
rs_proc(p1, cr_cnt, rs1, rs2);
}
/*==================================================================*/
/* name = Result Set 導通用メソッド */
/*==================================================================*/
public static void rs_proc(java.lang.Integer p1,int icnt_cr[],
java.sql.ResultSet[] rs1,
java.sql.ResultSet[] rs2) throws SQLException {
java.lang.Integer x_goods_no;
java.math.BigDecimal x_quantity_1, x_total_quantity;
try {
// コネクトオブジェクト生成(Java手続き内ではCONNECTは発行されない)
java.sql.Connection con =
DriverManager.getConnection("jdbc:hitachi:hirdb");
con.setAutoCommit(false); // 自動コミットの抑止
// SELECT(stmt1)前処理
java.sql.PreparedStatement stmt1 =
con.prepareStatement("SELECT c1, c2 FROM rs_t1 WHERE c1 > ?");
// SELECT(stmt1)入力パラメタ設定
stmt1.setInt(1, p1.intValue());
// SELECT(stmt2)前処理
java.sql.PreparedStatement stmt2 =
con.prepareStatement("SELECT c1, c2 FROM rs_t2 WHERE c1 > 10");
// SELECT(stmt1)実行
rs1[0] = stmt1.executeQuery();
// SELECT(stmt2)実行
rs2[0] = stmt2.executeQuery();
// 動的結果集合の数
icnt_cr[0] = 2;
// SELECT(stmt2)実行(一行だけ取り出す)
rs2[0].next();
} catch (SQLException ex) { // SQLエラー処理
SQLException fast_ex = ex;
System.out.println("\n***** SQLException caught *****\n");
while (ex != null) {
System.out.println ("SQLState: " + ex.getSQLState ());
System.out.println ("Message: " + ex.getMessage ());
System.out.println ("Vendor: " + ex.getErrorCode ());
ex.printStackTrace();
ex = ex.getNextException ();
System.out.println ("");
}
System.out.println("*******************************\n");
throw fast_ex;
}
return;
}
}
|
/* ALL RIGHTS RESERVED,COPYRIGHT (C)2000,HITACHI,LTD. */
/* LICENSED MATERIAL OF HITACHI,LTD. */
/************************************************************************/
/* name = HiRDB 06-00 Javaストアド Result Set 導通用ジョブ */
/************************************************************************/
import java.lang.*;
import java.math.*;
import java.sql.*;
/************************************************************************/
/* name = Result Set 導通用クラス(CALL側) */
/************************************************************************/
public class sample4ap {
/*==================================================================*/
/* name = デバッグ用メインメソッド */
/*==================================================================*/
public static void main(String args[]) throws SQLException {
try {
// Driverクラスの登録
Class.forName("JP.co.Hitachi.soft.HiRDB.JDBC.HiRDBDriver");
} catch (ClassNotFoundException ex) {
System.out.println("\n***** ClassNotFoundException caught *****\n");
ex.printStackTrace();
System.out.println ("");
System.out.println("*******************************\n");
return;
}
rs_call();
}
/*==================================================================*/
/* name = Result Set 導通用メソッド */
/*==================================================================*/
public static void rs_call() throws SQLException {
java.lang.Integer xc1;
java.lang.String xc2;
int cr_cnt[] = new int[1];
try {
// コネクトオブジェクト生成(Java手続き内ではCONNECTは発行されない)
java.sql.Connection con =
DriverManager.getConnection
("jdbc:hitachi:hirdb", "\"USER1\"", "\"PASS1\"");
con.setAutoCommit(false); // 自動コミットの抑止
// CALL(stmt1)前処理
java.sql.CallableStatement stmt1 =
con.prepareCall("{CALL rs_proc(?,?)}");
// CALL(stmt1)入力パラメタ設定
stmt1.setInt(1, 10);
stmt1.registerOutParameter(2, java.sql.Types.INTEGER);
// CALL(stmt1)実行
stmt1.execute();
// CALL(stmt1)出力パラメタ取得
cr_cnt[0] = stmt1.getInt(2);
System.out.println("cr_cnt=" + cr_cnt[0] + "\n");
// 動的結果集合の取得
java.sql.ResultSet rs = stmt1.getResultSet();
while (rs.next()) {
// SELECT(stmt1)検索結果取得
xc1 = (Integer)rs.getObject("c1");
xc2 = (String)rs.getObject("c2");
System.out.println("xc1=" + xc1 + ",xc2=" + xc2 + "\n");
}
// カーソルクローズ
rs.close();
if (stmt1.getMoreResults()) {
rs = stmt1.getResultSet();
while (rs.next()) {
// SELECT(stmt1)検索結果取得
xc1 = (Integer)rs.getObject("c1");
xc2 = (String)rs.getObject("c2");
System.out.println("xc1=" + xc1 + ",xc2=" + xc2 + "\n");
}
}
// カーソルクローズ
rs.close();
// 各ステートメントオブジェクト解放
stmt1.close();
// コネクション切断
con.close();
} catch (SQLException ex) { // SQLエラー処理
SQLException fast_ex = ex;
System.out.println("\n***** SQLException caught *****\n");
while (ex != null) {
System.out.println ("SQLState: " + ex.getSQLState ());
System.out.println ("Message: " + ex.getMessage ());
System.out.println ("Vendor: " + ex.getErrorCode ());
ex.printStackTrace();
ex = ex.getNextException ();
System.out.println ("");
}
System.out.println("*******************************\n");
throw fast_ex;
}
return;
}
}
|
CREATE PROCEDURE rs_proc(IN p1 INT,OUT cr_cnt INT) DYNAMIC RESULT SETS 2 LANGUAGE JAVA EXTERNAL NAME 'sample4.jar:sample4rs.rs_proc(java.lang.Integer, int[], java.sql. ResultSet[], java.sql.ResultSet[]) returns void' PARAMETER STYLE JAVA end_proc; |
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.