zoukankan      html  css  js  c++  java
  • 编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

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

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

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

        包头:根据以下步骤创建

    命名包名:mypackage:

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

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

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

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

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

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

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

    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+"	"+name+"	"+salary+"	"+job);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally {
    			JDBCUtils.release(conn, call, rs);
    		}
    	}
    }
    

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

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

  • 相关阅读:
    微信小程序的scheme码
    微信小程序的简单总结(uni-app)
    ES7-ES11新特性
    Promise 总结
    uni-app创建项目及使用 vant-weapp
    vscode 插件整理
    el-upload 组件总结
    从输入URL到页面显示过程中发生了什么
    实验 1:Mininet 源码安装和可视化拓扑工具
    2020软件工程第一次作业
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/9196927.html
Copyright © 2011-2022 走看看