Oracle存储过程和自定义函数(4)

包体

包头: create or replace package MyPackage is -- Author : ADMINISTRATOR -- Created : 2016-6-4 18:10:42 -- Purpose : -- 使用type关键字 is ref cursor说明是cursor类型 type staffCursor is ref cursor; procedure queryStaffJob(pJob in xgj_test.job%type, jobStaffList out staffCursor); end MyPackage;

创建完包头之后,创建包体,包体需要实现包头中声明的所有方法。

包体 create or replace package body MyPackage is procedure queryStaffJob(pJob in xgj_test.job%type, jobStaffList out staffCursor) as begin open jobStaffList for select * from xgj_test t where t.job=pJob; end queryStaffJob; end MyPackage;

事实上,通过plsql工具创建包头,编译后,包体的框架就会自动的生成了。

这里写图片描述

在应用程序中访问包下的存储过程 在应用程序中访问包下的存储过程

在应用程序中访问包下的存储过程 ,需要带包名

import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import org.junit.Test; import com.turing.oracle.dbutil.DBUtils; import oracle.jdbc.OracleTypes; import oracle.jdbc.driver.OracleCallableStatement; public class TestCursor { @Test public void testCursor(){ /** * * create or replace package MyPackage is type staffCursor is ref cursor; procedure queryStaffJob(pJob in xgj_test.job%type, jobStaffList out staffCursor); end MyPackage; */ String sql = "{call MyPackage.queryStaffJob(?,?)}" ; Connection conn = null; CallableStatement call = null ; ResultSet rs = null; try { // 获取数据库连接 conn = DBUtils.getConnection(); // 通过conn创建CallableStatemet call = conn.prepareCall(sql); // in 参数 需要赋值 call.setString(1, "Staff"); // out 参数需要声明 call.registerOutParameter(2, OracleTypes.CURSOR); // 执行调用 call.execute(); // 获取返回值 rs = ((OracleCallableStatement)call).getCursor(2); while(rs.next()){ // 取出值 String username = rs.getString("username"); double sal = rs.getDouble("sal"); double comm = rs.getDouble("comm"); System.out.println("username:" + username + "\t sal:" + sal + "\t comm:" + comm); } } catch (Exception e) { e.printStackTrace(); }finally { DBUtils.cleanup(conn, call, rs); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/efb321526297e9e1db6054f73eebaa52.html