欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

程序员文章站 2022-06-20 13:26:50
在本系列学习随笔中的第2节我们留下了2个问题,我们现在讨论在out参数中使用光标。 1、要在out参数中使用光标,我们需要申明一个包的结构,包的结构分为包头和包体,包头只负责申明,包体只负责实现。包头、包体也是数据库中的对象,与表是同一级别类型。 应用场景举例:查询某部门所有员工的所有信息 包头:根 ......

在本系列学习随笔中的第2节我们留下了2个问题,我们现在讨论在out参数中使用光标。

1、要在out参数中使用光标,我们需要申明一个包的结构,包的结构分为包头和包体,包头只负责申明,包体只负责实现。包头、包体也是数据库中的对象,与表是同一级别类型。

    应用场景举例:查询某部门所有员工的所有信息

    包头:根据以下步骤创建

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

命名包名:mypackage:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

在包中编写我们自己的存储过程或者存储函数:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

按下键盘ctrl+s,sql developer将自动存盘并且进行编译:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

接下来我们创建包的主体:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

将会自动为我们创建要实现的包体部分:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

然后我们将包体实现完整:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

同样,按下ctrl+s后,将自动帮我们存盘和编译生成相应的包体结构树:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

使用desc语句查看包的结构:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

2、在应用中访问包中的存储过程,需要带上包的名字

    在测试包中添加我们的测试类TestCursor.java

package demo.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;

import org.junit.Test;

import demo.utils.JDBCUtils;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.internal.OracleTypes;

public class TestCursor {

	/**
	 * create or replace PACKAGE MYPACKAGE AS 
		  type empcursor is ref cursor;
		  procedure queryEmpList(dno in number,empList out empcursor);
	   END MYPACKAGE;
     */
	@Test
	public void testCursor(){
		//{call <procedure-name>[(<agr1>,<agr2>,...)]}
		String sql="{call MYPACKAGE.queryEmpList(?,?)}";
		Connection conn=null;
		CallableStatement call=null;
		ResultSet rs=null;
		try {
			//获得数据库连接
			conn=JDBCUtils.getConnection();
			
			//根据连接创建statment
			call=conn.prepareCall(sql);
			
			//对in参数赋值
			call.setInt(1, 10);
			
			//对out参数进行申明
			call.registerOutParameter(2, OracleTypes.CURSOR);
			
			//执行我们的调用
			call.execute();
			
			//取出该部门中所有员工的信息,由于我们当前是Oracle的光标,Oracle的存储过程,所以我们要对call进行转换
			rs=((OracleCallableStatement)call).getCursor(2);
			while(rs.next()){
				//取出该员工的员工号、姓名、薪水、职位字段作为示例
				int empno = rs.getInt("empno");
				String name = rs.getString("ename");
				double salary = rs.getDouble("sal");
				String job = rs.getString("job");
				System.out.println(empno+"\t"+name+"\t"+salary+"\t"+job);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.release(conn, call, rs);
		}
	}
}

  启动我们的单元测试,运行结果:

编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

总结:存储过程可以实现存储函数所有的能力