首先要明确一个概念
PROCEDURE TRIGGER PACKAGE 的区别
简单的说,PROCEDURE, TRIGGER都是一段程序
但PROCEDURE需要手工调用,TRIGGER满足你设定的条件会自动执行
PACKAGE是 把几个程序封装在一起,和JAVA里的PACKAGE的概念差不多。
得到返回的结果集需要建立PACKAGE,并且返回列表需要通过返回游标实现
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
1、在SQL*PLUS中建一个程序包(在包中定义了一个类型游标)
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
procedure TESTC(cur_ref out Test_CURSOR);
end TESTPACKAGE;
2、建立包之后建立存储过程
create or replace package body TESTPACKAGE as
procedure TESTC(cur_ref out Test_CURSOR) is
begin
OPEN cur_ref FOR select * from test;
end TESTC;
END TESTPACKAGE;
可以看到,它是把游标(cursor)(可以理解为一个指针),作为一个out 参数来返回值的。
JAVA调用程序如下:
- package com.rizon.tree.excelApi;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public class CursorTest {
- Connection conn = null;
- ResultSet rs = null;
- try {
- Class.forName("oracle.jdbc.driver.OracleDriver");
- "jdbc:oracle:thin:@10.0.41.100:1521:orcl", "forestrytree",
- "forestrytree");
- oracle.jdbc.OracleCallableStatement stmt = (oracle.jdbc.OracleCallableStatement) conn
- .prepareCall("{call TESTPACKAGE.TESTC(?)}");
- // stmt.setString(1, "1");
- stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
- stmt.execute();
- rs = stmt.getCursor(1);
- for (int i = 0; rs.next();) {
- + "telephone:" + rs.getString(2));
- }
- ex.printStackTrace();
- } finally {
- if (conn != null) {
- conn.close();
- conn = null;
- }
- if (rs != null) {
- rs.close();
- rs = null;
- }
- }
- }
- }