create table test(
id varchar2(32),
name varchar2(32)
);
CREATE OR REPLACE PROCEDURE insert_procedure(
PARA1 IN VARCHAR2,
PARA2 IN VARCHAR2
) AS
BEGIN
INSERT INTO test (id, name) VALUES (PARA1, PARA2);
END insert_procedure;
CREATE OR REPLACE PROCEDURE select_procedure(
para_id IN VARCHAR2,
name OUT sys_refcursor
) AS
BEGIN
OPEN name FOR SELECT * FROM test WHERE id = para_id;
END;
重點:sys_refcursor 定義在 SYS.STANDARD 套件中,用於回傳結果集。
public class DBUtil {
public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
public static final String URL = "jdbc:oracle:thin:@localhost:1521/orcl";
public static final String USERNAME = "pfm";
public static final String PASSWORD = "pfm";
static {
try { Class.forName(DRIVER); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
public static Connection getConnection() {
try { return DriverManager.getConnection(URL, USERNAME, PASSWORD); }
catch (SQLException e) { e.printStackTrace(); return null; }
}
// 關閉資源的完整方法組:closeResultSet、closeStatement、closeConnection、closeAll
}
public static void insert_call() {
Connection conn = DBUtil.getConnection();
CallableStatement proc = null;
try {
proc = conn.prepareCall("{ call insert_procedure(?,?) }");
proc.setString(1, "1");
proc.setString(2, "hello call");
proc.execute();
} catch (SQLException e) { e.printStackTrace(); }
finally {
try { proc.close(); DBUtil.closeAll(null, null, conn); }
catch (Exception e) { e.printStackTrace(); }
}
}
public static void select_call() {
Connection conn = DBUtil.getConnection();
CallableStatement stmt = null;
try {
stmt = conn.prepareCall("{ call select_procedure(?, ?) }");
stmt.setString(1, "1");
stmt.registerOutParameter(2, OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = (ResultSet) stmt.getObject(2);
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) { e.printStackTrace(); }
finally { DBUtil.closeConnection(conn); }
}
CallableStatement 執行預存程序setXxx(),輸出參數用 registerOutParameter() 指定型別oracle.jdbc.driver.OracleTypes.CURSORfinally 區塊關閉所有資源,避免洩漏