上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数

1、在应用程序中调用我们的存储过程

创建一个简单的Java工程,如:TestOracle,在项目中新建lib文件夹,并拷贝ojdbc14.jar,添加到系统路径中,目录结构如下:

在项目中创建一个用于连接数据库以及与数据库执行交流的工具类JDBCUtils.java

package demo.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; public class JDBCUtils { private static String driver="oracle.jdbc.OracleDriver";
private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
private static String user="scott";
private static String password="scott"; //注册数据库驱动
static {
try {
Class.forName(driver);
// DriverManager.registerDriver(driver);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
} //获取数据库连接
public static Connection getConnection() {
try {
return DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} //释放数据库资源
public static void release(Connection conn,Statement st,ResultSet rs) {
if(rs!=null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
rs=null;
}
} if(st!=null) {
try {
st.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
st=null;
}
} if(conn!=null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
conn=null;
}
}
}
}

  创建我们的测试包,在包中创建我们的测试类TestProcedure.java

package demo.oracle;

import java.sql.CallableStatement;
import java.sql.Connection; import org.junit.Test; import demo.utils.JDBCUtils;
import oracle.jdbc.internal.OracleTypes; public class TestProcedure { /**
* create or replace PROCEDURE queryempinform(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2)*/
@Test
public void testProcedure() {
//{call <procedure-name>[(<arg1>,<arg2>,...)]}
String sql="{call queryempinform(?,?,?,?)}";
Connection conn=null;
CallableStatement call=null;
try {
//得到一个连接
conn=JDBCUtils.getConnection();
//通过连接创建出statment
call=conn.prepareCall(sql); //对in参数进行赋值
call.setInt(1, 7839); //对out参数进行申明
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.registerOutParameter(3, OracleTypes.NUMBER);
call.registerOutParameter(4, OracleTypes.VARCHAR); //设置文笔之后,开始我们的存储过程的调用
call.execute(); //取出结果
String name=call.getString(2);
double sal=call.getDouble(3);
String job=call.getString(4);
System.out.println(name+"\t"+sal+"\t"+job); } catch (Exception e) {
//遇到异常将其打印到控制台输出
e.printStackTrace();
}finally {
//释放数据库资源
JDBCUtils.release(conn, call, null);
}
}
}

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

2、在应用程序中调用我们的存储函数

在测试包中创建我们的测试类TestFunction.java

package demo.oracle;

import java.sql.CallableStatement;
import java.sql.Connection; import org.junit.Test; import demo.utils.JDBCUtils;
import oracle.jdbc.internal.OracleTypes; public class TestFunction { /**
* create or replace FUNCTION queryempincome(eno in number)
return number
*/
@Test
public void testFunction() {
//{?=call <procedure-name>[(<arg1>,<arg2>,...)]}
String sql="{?=call queryempincome(?)}"; Connection conn=null;
CallableStatement call=null;
try {
//得到数据库连接
conn=JDBCUtils.getConnection(); //基于连接得到statment
call=conn.prepareCall(sql); //对in参数赋值
call.setInt(2, 7839); //对out参数进行申明
call.registerOutParameter(1, OracleTypes.NUMBER); //执行我们存储函数的调用
call.execute(); //取得我们的结果
double income=call.getDouble(1);
System.out.println("该员工的年收入是:"+income);
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, call, null);
}
}
}

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

3、返回游标,读取游标中的数据

在测试包中创建我们的测试类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数据库--存储过程和存储函数(2)的更多相关文章

  1. 编程开发之--Oracle数据库--存储过程和存储函数(1)

    1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or re ...

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

    在本系列学习随笔中的第2节我们留下了2个问题,我们现在讨论在out参数中使用光标. 1.要在out参数中使用光标,我们需要申明一个包的结构,包的结构分为包头和包体,包头只负责申明,包体只负责实现.包头 ...

  3. Oracle数据库---存储过程、存储函数

    --创建存储过程CREATE OR REPLACE PROCEDURE first_procISBEGIN DBMS_OUTPUT.PUT_LINE('我是过程'); DBMS_OUTPUT.PUT_ ...

  4. 编程开发之--Oracle数据库--存储过程使用动态参数绑定(3)

    1.动态参数绑定,可以实现动态的执行不同的sql --创建包 create or replace PACKAGE MYPACKAGE AS type empcursor is ref cursor; ...

  5. oracle之存储过程和存储函数的使用和区别

    #存储过程:封装在服务器上一段sql片段,已经编译好了的代码. 1.客户端调存储过程,执行效率就会非常高效. 语法: create [or replace] procedure 存储过程名称 (参数名 ...

  6. oracle数据库中的存储函数

    oracle中的存储函数,和系统内的函数类似,可以像调用系统函数一样调用存储函数.它与存储过程的唯一区别就是存储过程没有return返回值,存储函数可以与存储过程互换,存储函数可以在存储过程中调用. ...

  7. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  8. oracle存储过程和存储函数&触发器

    oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 ...

  9. MySQL数据库之存储过程与存储函数

    1 引言 存储过程和存储函数类似于面向对象程序设计语言中的方法,可以简化代码,提高代码的重用性.本文主要介绍如何创建存储过程和存储函数,以及存储过程与函数的使用.修改.删除等操作. 2 存储过程与存储 ...

随机推荐

  1. easyui树形菜单实现

    需求:读取路径配置中的相对路径获取对应的子文件夹及其子文件并形成树形结构,加载xml文件,输入搜索关键字匹配xml里面的value节点的值对应的contact值的集合并进行搜索 例如:输入b,找到xm ...

  2. 网络测速 php代码

    <?php /*=====http://hi.csdn.net/yinyiniao=====*/ $fp=fopen("cs.txt","w"); for ...

  3. Navicat 连接 Oracle数据库并,导入数据泵(.dmp)

    如有什么质疑的地方,希望可以和大家一起探讨,共同进步. 一.安装方法: 1.首先下载Navicat Premium和Oracle Database Oracle Database官网下载地址:http ...

  4. 用webpack实现前端自动化构建

    什么是自动化的前端构建流? 1. 自动补全css私有前缀,自动转化less\sass为css,自动转化es6\vue\jsx语法为js,自动打包小图片为base64以减少http请求,自动给js,cs ...

  5. windows 下 openssl 生成RSA私钥公钥以及PKCS8

    生成RSA私钥 打开bin文件夹下面的openssl.exe,输入genrsa -out rsa_private_key.pem 1024 把RSA私钥转换成PKCS8格式 输入命令pkcs8 -to ...

  6. 7.bootstrap HTML编码规范

    Bootstrap HTML编码规范 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格). 对于属性的定义,确保全部使用双 ...

  7. MySQL经典错误

    本文目录: Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行)Top 2:(主从复制报错类型)Top 3:MySQL安装过程中的报错Top 4:数 ...

  8. ssh key生成步骤

    1. 安装git,从程序目录打开 "Git Bash" ,或者直接用git shell,github自带的工具 2. 键入命令:ssh-keygen -t rsa -C " ...

  9. Sqlserver新建随机测试数据

    USE Test --使用数据库Test(如果没有则需要新建一个) ----1.新建一个users表 create table users( uId int primary key identity( ...

  10. sequelize 学习之路

    如果你觉得Sequelize的文档有点多.杂,不方便看,可以看看这篇. 在使用NodeJS来关系型操作数据库时,为了方便,通常都会选择一个合适的ORM(Object Relationship Mode ...