上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在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. vmware 虚拟机导入OVF出现路径错误

    现状: 需要将原有数据中心的VM虚拟机导出本地OVF模板,然后迁移至新的机房虚拟化环境后从新导入. 问题: 导入OVF时候,先出现错误问题1,修复完成后,出现错误问题2 1. OVF迁移至本地以后,导 ...

  2. 简析 Tomcat 、Nginx 与 Apache 的区别

    简析 Tomcat .Nginx 与 Apache 的区别 本文讲的是简析 Tomcat .Nginx 与Apache的区别, 经常在用 apache 和 tomcat 等这些服务器,可是总感觉还是不 ...

  3. 有关从经典部署模型迁移到 Azure Resource Manager 部署模型的常见问题

    此迁移计划是否影响 Azure 虚拟机上运行的任何现有服务或应用程序? 不可以. VM(经典)是公开上市的完全受支持的服务. 你可以继续使用这些资源来拓展你在 Azure 上的足迹. 如果我近期不打算 ...

  4. CSS标准文档流 块级元素和行内元素

    标准文档流 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”.而设计软件 ,想往哪里画东西,就去哪里画 空白折叠现象 ...

  5. 如何找回SQL Server实例安装时的序列号

    当需要再次安装SQL Server时,如果序列号找不到了,可以试着从已经安装的实例里找回序列号,因为安装完SQL Server后,序列号(Product Key)被保存在注册表里: MSDN订阅下载的 ...

  6. [翻译] DoActionSheet

    DoActionSheet https://github.com/donobono/DoActionSheet An replacement for UIActionSheet : block-bas ...

  7. C#中Array、ArrayList和List三者的区别

    1.Array  在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 它的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小. 2. ...

  8. Office 365实现单点登录系列(1)—域环境搭建

    Hello 小伙伴们, 2018新年快乐,作为2018年首篇文章,怎么能不给大家带来点干货呢?这篇文章其实我9月底的时候已经在MSDN上发布过了,为表诚意,我更新了这篇文章,并把它组成了一个系列,2. ...

  9. 设置OWA访问HTTP到HTTPS的重定向

    需求:公司要求使用Http://mail.ever.com的方式来统一访问邮箱,所以需要进行相关的设置,将访问需求重定向到https://extest.ever.com/owa 首先在DNS里的eve ...

  10. Linux命令--文件处理

    touch命令 Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间.若文件不存在,系统会建立一个新的文件. ls -l 可以显示档案的时间记录. 语法 touch [-a ...