从 Java Servlet 调用 Firebird 存储过程
Calling Firebird Stored procedure from Java Servlet
我有一个带有一些存储过程的 Firebird 数据库,我正在开发一个 Java web/database 应用程序。我想知道是否可能以及如何从 java Class 或 Servlet 调用这些存储过程。
示例:
- 存储过程
deletep
,用于从数据库中删除一行
- 我的网络应用程序 Jsp/servlets
- 我想创建一个 link 来执行我的删除存储过程
这可以使用 Jaybird,即 Firebird JDBC 驱动程序。
三个步骤:
创建一个 DBUtil java class 来存储查询:
public static void deletePlan(Connection conn, CallableStatement
statement, String code, String rev, String mention) throws SQLException {
statement.setString(1, code);
statement.setString(2, rev);
statement.setString(3, mention);
statement.execute();
}
创建删除 servlet
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Connection conn = MyUtils.getStoredConnection(request);
String code = request.getParameter("code");
String rev = request.getParameter("revision");
String mention = request.getParameter("mention");
CallableStatement statement = null;
try {
statement = conn.prepareCall("execute procedure
DELETEP(?,?,?)");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String errorString = null;
try {
DBUtils.deletePlan(conn, statement, code, rev, mention);
} catch (SQLException e) {
e.printStackTrace();
errorString = e.getMessage();
}
.........
在 jsp 文件中创建删除 link
<a href="${pageContext.request.contextPath}/deletePlan code=${plan.code}&revision=${plan.revision}&mention=${plan.mention}">Delete</a>
要在 Java 中执行 Firebird 存储过程,有几种方法。 JDBC-default 方法类似于:
try (CallableStatement cstmt = connection.prepareStatement(
"{call yourProcedure(?, ?, ?)}")) {
cstmt.setString(1, "value1");
cstmt.setString(2, "value2");
cstmt.setString(3, "value3");
cstmt.execute();
}
如果 Firebird 存储过程是可选的(即:包含 SUSPEND
并且可以 return 多行),您需要执行如下操作:
try (CallableStatement cstmt = connection.prepareStatement(
"{call yourProcedure(?, ?, ?)}")) {
cstmt.setString(1, "value1");
cstmt.setString(2, "value2");
cstmt.setString(3, "value3");
try (ResultSet rs = cstmt.executeQuery()) {
while(rs.next()) {
// do something with result set rows ...
}
}
}
如果存储过程是可执行的并且没有 return 任何值,这就足够了。如果存储过程可执行(多个)return 列,则需要类似:
try (CallableStatement cstmt = connection.prepareStatement(
"{call yourProcedure(?, ?, ?, ?, ?)}")) {
cstmt.setString(1, "value1");
cstmt.setString(2, "value2");
cstmt.setString(3, "value3");
cstmt.registerOutParameter(4, Types.VARCHAR);
cstmt.registerOutParameter(5, Types.VARCHAR)
cstmt.execute();
String out1 = cstmt.getString(4);
String out2 = cstmt.getString(5);
// do something with result
}
或者,您可以将 Firebird 特定语法 EXECUTE PROCEDURE yourProcedure(?, ?, ?)
用于可执行存储过程和 SELECT * FROM yourProcedure(?, ?, ?)
.
我有一个带有一些存储过程的 Firebird 数据库,我正在开发一个 Java web/database 应用程序。我想知道是否可能以及如何从 java Class 或 Servlet 调用这些存储过程。
示例:
- 存储过程
deletep
,用于从数据库中删除一行 - 我的网络应用程序 Jsp/servlets
- 我想创建一个 link 来执行我的删除存储过程
这可以使用 Jaybird,即 Firebird JDBC 驱动程序。
三个步骤:
创建一个 DBUtil java class 来存储查询:
public static void deletePlan(Connection conn, CallableStatement statement, String code, String rev, String mention) throws SQLException { statement.setString(1, code); statement.setString(2, rev); statement.setString(3, mention); statement.execute(); }
创建删除 servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = MyUtils.getStoredConnection(request); String code = request.getParameter("code"); String rev = request.getParameter("revision"); String mention = request.getParameter("mention"); CallableStatement statement = null; try { statement = conn.prepareCall("execute procedure DELETEP(?,?,?)"); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } String errorString = null; try { DBUtils.deletePlan(conn, statement, code, rev, mention); } catch (SQLException e) { e.printStackTrace(); errorString = e.getMessage(); } .........
在 jsp 文件中创建删除 link
<a href="${pageContext.request.contextPath}/deletePlan code=${plan.code}&revision=${plan.revision}&mention=${plan.mention}">Delete</a>
要在 Java 中执行 Firebird 存储过程,有几种方法。 JDBC-default 方法类似于:
try (CallableStatement cstmt = connection.prepareStatement(
"{call yourProcedure(?, ?, ?)}")) {
cstmt.setString(1, "value1");
cstmt.setString(2, "value2");
cstmt.setString(3, "value3");
cstmt.execute();
}
如果 Firebird 存储过程是可选的(即:包含 SUSPEND
并且可以 return 多行),您需要执行如下操作:
try (CallableStatement cstmt = connection.prepareStatement(
"{call yourProcedure(?, ?, ?)}")) {
cstmt.setString(1, "value1");
cstmt.setString(2, "value2");
cstmt.setString(3, "value3");
try (ResultSet rs = cstmt.executeQuery()) {
while(rs.next()) {
// do something with result set rows ...
}
}
}
如果存储过程是可执行的并且没有 return 任何值,这就足够了。如果存储过程可执行(多个)return 列,则需要类似:
try (CallableStatement cstmt = connection.prepareStatement(
"{call yourProcedure(?, ?, ?, ?, ?)}")) {
cstmt.setString(1, "value1");
cstmt.setString(2, "value2");
cstmt.setString(3, "value3");
cstmt.registerOutParameter(4, Types.VARCHAR);
cstmt.registerOutParameter(5, Types.VARCHAR)
cstmt.execute();
String out1 = cstmt.getString(4);
String out2 = cstmt.getString(5);
// do something with result
}
或者,您可以将 Firebird 特定语法 EXECUTE PROCEDURE yourProcedure(?, ?, ?)
用于可执行存储过程和 SELECT * FROM yourProcedure(?, ?, ?)
.