| HSQLDB | HSQLDBのストアドプロシージャ | |
| (not ever) |
| HSQLDBのストアドプロシージャ |
●OUT引数を持たないストアドプロシージャのサンプル
それでは早速、ストアドプロシージャのサンプルを一つテキストファイルで書いてみます。
DROP PROCEDURE UPDATE_NOTES IF EXISTS;
CREATE PROCEDURE UPDATE_NOTES(
IN ani_item_id INT,
IN avi_notes VARCHAR(255),
IN ani_display_order INT
)
MODIFIES SQL DATA
BEGIN ATOMIC
UPDATE ITEMS
SET NOTES = avi_notes,
DISPLAY_ORDER = ani_display_order
WHERE ITEM_ID = ani_item_id;
END;
.;
\i procedure.sql
引数で渡した値でNOTESとDISPLAY_ORDERというそれぞれVARCHAR、INT型の列を更新するだけのサンプルですが、 これだけでも幾つか注意点があります。
作ったらさっそく実行してみましょう。SqlToolからはこのように実行できます。
CALL UPDATE_NOTES(10, 'テストの備考', 398); SELECT * FROM ITEMS WHERE ITEM_ID = 10; COMMIT;
●OUT引数を持つストアドプロシージャのサンプル
先のサンプルでは、OUT引数を持たないので処理結果を返すことができませんでした
(別途処理結果ログテーブルなどを作って書き込み、後続処理で参照するなどで対応できますが)。
というわけで、次にOUT引数を持つ版を作ってみます。
DROP PROCEDURE UPDATE_NOTES IF EXISTS;
CREATE PROCEDURE UPDATE_NOTES(
IN ani_item_id INT,
IN avi_notes VARCHAR(255),
IN ani_display_order INT,
OUT ano_ora INT,
OUT avo_message VARCHAR(255)
)
MODIFIES SQL DATA
BEGIN ATOMIC
DECLARE ln_affected_rows INT;
SET ano_ora = 0;
SET avo_message = '(OK)';
UPDATE ITEMS
SET NOTES = avi_notes,
DISPLAY_ORDER = ani_display_order
WHERE ITEM_ID = ani_item_id;
GET DIAGNOSTICS ln_affected_rows = ROW_COUNT;
if ln_affected_rows = 0 then
SET ano_ora = 123; /* 適当 */
SET avo_message = '対象レコードが見つかりません。';
end if;
END;
.;
●JDBCでストアドプロシージャを実行するサンプル
では、そのJDBCで接続してストアドプロシージャを実行するサンプルです。
こちらはJDBC共通のCallableStatementを使っているため、Oracle等と同じで特に問題になる点はないと思います。
package test.jdbc;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HsqldbCallableExample {
public static void main(String args[]) {
Connection conn = null;
CallableStatement stmt = null;
try {
// JDBCドライバをロードし、データベースに接続
//Class.forName("org.hsqldb.jdbcDriver");
//final String url = "jdbc:hsqldb:file:C:/usr/dbms/hsqldb-2.7/database/nkdb;shutdown=true;ifexists=true";
final String url = "jdbc:hsqldb:hsql://localhost:9001/nkx;ifexists=true";
conn = DriverManager.getConnection(url, "sa", "");
System.out.println("connected.");
// SQL文(DML文)作成とパラメータ設定
final String sql = "{call UPDATE_NOTES(?, ?, ?, ?, ?)}";
final int itemId = 10;
final String notes = "テスト by JDBC";
final int displayOrder = 398;
stmt = conn.prepareCall(sql);
stmt.setInt(1, itemId);
stmt.setString(2, notes);
stmt.setInt(3, displayOrder);
stmt.registerOutParameter(4, java.sql.Types.INTEGER);
stmt.registerOutParameter(5, java.sql.Types.VARCHAR);
// ストアドプロシージャの実行とOUTパラメータの値の取得
stmt.execute();
final int status = stmt.getInt(4);
final String message = stmt.getString(5);
System.out.println("Calling stored procedure ended successfully.");
System.out.println(" with status=[" + status + "] message=[" + message + "]");
} catch(Exception ex) {
ex.printStackTrace();
} finally {
try {
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
} catch(SQLException ex) {
ex.printStackTrace();
}
}
}
}
| もくじ | ||
| HSQLDB | (C) 2002-2025 MISUMI URANO (2025/03/23 - (not ever)) |