目的:存储过程查询一张表得到多条记录,由java获取这些记录。
例子:
1、创建一张表,插入数据
CREATE TABLE TEST_TABLE(
ID NUMBER(16),
NAME VARCHAR2(20)
);
insert into TEST_TABLE (ID, NAME) values ('1', '张三');
insert into TEST_TABLE (ID, NAME) values ('2', '李四');
2、创建存储过程
--包头
CREATE OR REPLACE PACKAGE PKG_TEST IS
TYPE CURSOR_TYPE IS REF CURSOR;--用于接收结果的游标
PROCEDURE P_TEST(O_CURSOR OUT CURSOR_TYPE);--存储过程
END PKG_TEST;
--包体
CREATE OR REPLACE PACKAGE BODY PKG_TEST IS
PROCEDURE P_TEST(O_CURSOR OUT CURSOR_TYPE) IS--输出的是包头中定义的游标
BEGIN
OPEN O_CURSOR FOR
SELECT ID, NAME FROM TEST_TABLE;--将查询结果放入游标中
END P_TEST;
END PKG_TEST;
3、编写java代码
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleCallableStatement;
public class Test {
public static void main(String[] args) {
Connection conn = null;
CallableStatement proc = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
proc = conn.prepareCall("{ call PKG_TEST.P_TEST(?) }");//存储过程包.名
proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);//需要注册输出的参数
proc.execute();//执行存储过程
rs = ((OracleCallableStatement) proc).getCursor(1);//获取结果集
while (rs.next()) {
System.out.println("ID:" + rs.getInt("ID") + " NAME:" + rs.getString("NAME"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (conn != null && !conn.isClosed()) conn.close();
rs = null;
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4、代码执行结果如下:
ID:1 NAME:张三
ID:2 NAME:李四
5、注意:
如果报"类型长度大于最大值"的错,按照网上资料,将1.29M的ojdbc14.jar包替换为1.46M的后解决。可以在oracle安装目录product\10.2.0\db_1\jdbc\lib下找到。