在存储过程中,有输入的参数也有输出参数,有一个问题是:如果我们要输出的参数特别多,或者说要输出一张表的所有字段,那张表可能有特别多的字段,我们要对每个输出的字段都使用out参数吗?可以是可以,但我们不可能这么做。我们想:能不能像java程序中,能不能定义一个集合或者一个bean容器来包含所有要输出的字段。
下面就使用光标类型的out参数来输出我们需要的数据信息:
我们可以新建一个包:包头和包体
包头:
CREATE OR REPLACE PACKAGE MYCORSOR AS --创建一个叫mycorsor的包type user_cursor is ref cursor; --定义一个cursor类型的user_cursorPRocedure queryuserlist(userlist out user_cursor); --创建存储过程,输出cursor类型userlistEND MYCORSOR;包体:CREATE OR REPLACEPACKAGE BODY MYCORSOR AS procedure queryuserlist(userlist out user_cursor) AS BEGIN open userlist for select * from TB_USER; --打开光标 END queryuserlist;END MYCORSOR;然后在应用程序调用这个存储过程package jdbc.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import org.junit.Test;import jdbc.utils.JDBCUtils;import Oracle.jdbc.driver.OracleCallableStatement;import oracle.jdbc.driver.OracleTypes;public class testCursor { @Test public void testcursor() { String sql = "{call MYCORSOR.queryuserlist(?)}";//包名.存储过程 Connection conn = null; CallableStatement call = null; ResultSet rs = null; try { conn = JDBCUtils.getConn(); call = conn.prepareCall(sql); call.registerOutParameter(1, OracleTypes.CURSOR); call.execute(); rs = ((OracleCallableStatement) call).getCursor(1);--得到输出内容 while (rs.next()) { System.out.println("id=" + rs.getString("id") + "姓名为:" + rs.getString("name") + "年龄为" + rs.getString("age") + "月薪为" + rs.getString("money")); } } catch (Exception e) { // TODO: handle exception } finally { JDBCUtils.release(conn, call, rs);--释放资源 } }}
新闻热点
疑难解答