疑问:怎样判断存储过程执行之后返回值是否为空。

一、连接oracle数据库

  1.需要的jar包:在安装的oracle中就有,所以不需要到官网下载,我的oracle11g下:D:\app\kdyzm\product\11.2.0\dbhome_1\jdbc\lib,文件夹中有若干.jar文件,选择ojdbc6.jar即可。

  2.连接oracle

    驱动位置:oracle.jdbc.OracleDriver

    url写法:jdbc:oracle:thin:@localhost:1521:orcl

  3.JDBCUtils

package com.kdyzm.dbutils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class JDBCUtils
{
private static final String driver="oracle.jdbc.driver.OracleDriver";
private static final String url="jdbc:oracle:thin:@localhost:1521:orcl";
private static final String username="scott";
private static final String password="tiger";
static
{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError("Oracle数据库连接初始化失败!");
}
}
//获取Connection连接的方法
public static Connection getConnection()
{
Connection conn=null;
try {
conn=DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} //释放资源的标准方法
public static void free(Connection conn,Statement st,ResultSet rs)
{
if(rs!=null)
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs=null;
if(st!=null)
{
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
st=null;
if(conn!=null)
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn=null;
}
}
}
}
}
}
}
}

  4.测试连接

package com.kdyzm.test;

import java.sql.Connection;

import com.kdyzm.dbutils.JDBCUtils;

/*
* 测试与Oracle数据库之间的连接
*/
public class TestConnection {
public static void main(String[] args) {
Connection conn=JDBCUtils.getConnection();
System.out.println(conn);
JDBCUtils.free(conn, null, null);
}
}

二、调用存储过程

  1.使用CallableStatement标准接口。

    java.sql.Statement

      |--java.sql.CallableStatement

  创建存储过程:

create or replace procedure searchEmpByEmpno(pempno in NUMBER,pename out varchar2,
pjob out varchar2,psal out number)
as
begin
select ename,job,sal into pename,pjob,psal from emp where empno=pempno;
end;

  2.调用存储过程

package com.kdyzm.test;
/*
* 测试oracle调用存储过程,并得到返回值。
*/
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import oracle.jdbc.OracleTypes;
import org.junit.Test;
import com.kdyzm.dbutils.JDBCUtils; public class TestProcedure {
@Test
public void testProcedure()
{
Connection conn=null;
ResultSet rs=null;
CallableStatement cs=null;
//SQL语句的形式:{call <procedure-name>[(<arg1>,<arg2>, ...)]}
String sql="{call searchEmpByEmpno(?,?,?,?)}";//这里的存储过程拥有四个参数,第一个是in类型的,其余的是out类型的。
try
{
conn=JDBCUtils.getConnection();
cs=conn.prepareCall(sql); //得到CallableStatement对象
cs.setInt(1, 7566); //设置in值 //注册三个输出值
cs.registerOutParameter(2, OracleTypes.VARCHAR);
cs.registerOutParameter(3, OracleTypes.VARCHAR);
cs.registerOutParameter(4, OracleTypes.DOUBLE);
//执行存储过程
cs.execute();
//得到返回结果
String ename=cs.getString(2);
String job=cs.getString(3);
double sal=cs.getDouble(4);
System.out.println(ename+" 的工作是: "+job);
System.out.println(ename+" 的薪水是: "+sal);
}
catch(Exception e)
{
e.printStackTrace();
}
finally{
JDBCUtils.free(conn, cs, rs);
}
}
}

三、调用存储函数

  1.本来没有什么不同之处,但这里由于任性使然,故展示一二,创建存储函数

create or replace function myfun(fempno in number)
return VARCHAR2
as
fename VARCHAR2(20);
begin
select ename into fename from emp where empno=fempno;
return fename;
end;

  2.调用存储函数

package com.kdyzm.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import oracle.jdbc.OracleTypes;
import com.kdyzm.dbutils.JDBCUtils;
/*
*测试调用存储函数。
*/
public class TestFunction {
public static void main(String[] args) {
Connection conn=null;
ResultSet rs=null;
CallableStatement cs=null;
// {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
String sql="{?=call myfun(?)}";
try
{
conn=JDBCUtils.getConnection();
cs=conn.prepareCall(sql);
cs.registerOutParameter(1, OracleTypes.VARCHAR);
cs.setInt(2, 7521);
cs.execute();
String ename=cs.getString(1);
System.out.println("查询结果为:"+ename);
}
catch(Exception e)
{
e.printStackTrace();
}
finally{
JDBCUtils.free(conn, cs, rs);
}
}
}

三、调用带有游标返回值的存储过程

  1.首先创建存储过程,这里需要使用包

    (1)声明包

--声明包
CREATE OR REPLACE
PACKAGE MYPACKAGE AS type empcursor is REF CURSOR;
PROCEDURE queryEmpList(pempno in NUMBER,empList out empcursor); END MYPACKAGE;

    (2)实现包体

CREATE OR REPLACE
PACKAGE BODY MYPACKAGE AS PROCEDURE queryEmpList(pempno in NUMBER,empList out empcursor) AS
BEGIN
open empList for select * from emp where pempno=empno;
END queryEmpList; END MYPACKAGE;

    (3)PL/SQL匿名块测试

--测试带有游标的out参数。
set serveroutput on;
declare
pempno number;
empList mypackage.empcursor;
empRow emp%rowtype;
begin
pempno:=7369;
mypackage.queryemplist(pempno,empList);
--open emplist;--注意一定不要再次open,因为游标只能打开一次,否则会报错。
loop
fetch emplist into empRow;
exit when emplist%notfound;
dbms_output.put_line(empRow.ename||'的工资是:'||empRow.sal);
end loop;
null;
close emplist;
end;
/

  2.调用存储过程

package com.kdyzm.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet; import oracle.jdbc.OracleTypes;
import oracle.jdbc.OracleCallableStatement;
import com.kdyzm.dbutils.JDBCUtils; /*
* 测试带有游标返回值的存储过程
* @author kdyzm
*
*/
public class TestProcedureWithCursor {
public static void main(String[] args) {
Connection conn=null;
CallableStatement cs=null;
ResultSet rs=null;
String sql="{call mypackage.queryemplist(?,?)}";
try
{
conn=JDBCUtils.getConnection();
cs=conn.prepareCall(sql);
cs.setInt(1, 7521);
cs.registerOutParameter(2, OracleTypes.CURSOR);
cs.execute();
OracleCallableStatement ocs=(OracleCallableStatement)cs;
rs=ocs.getCursor(2);
while(rs.next())
{
System.out.print(rs.getInt("empno")+" ");
System.out.print(rs.getString("ename")+" ");
System.out.print(rs.getString("JOB")+" ");
System.out.print(rs.getInt("MGR")+" ");
System.out.print(rs.getDate("HIREDATE")+" ");
System.out.print(rs.getDouble("SAL")+" ");
System.out.print(rs.getInt("COMM")+" ");
System.out.print(rs.getInt("DEPTNO")+" ");
System.out.println();
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally{
JDBCUtils.free(conn, cs, rs);
}
}
}

  3.运行结果

  

【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】的更多相关文章

  1. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】

    不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...

  2. 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】

    一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...

  3. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...

  4. 【Java EE 学习 69 下】【数据采集系统第一天】【实体类分析和Base类书写】

    之前SSH框架已经搭建完毕,现在进行实体类的分析和Base类的书写.Base类是抽象类,专门用于继承. 一.实体类关系分析 既然是数据采集系统,首先调查实体(Survey)是一定要有的,一个调查有多个 ...

  5. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

  6. 【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】

    之前说过,如果一个数据库中要存储的数据量整体比较小,但是其中一个表存储的数据比较多,比如日志表,这时候就要考虑分表存储了:但是如果一个数据库整体存储的容量就比较大,该怎么办呢?这时候就需要考虑分库了, ...

  7. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  8. 【Java EE 学习 29 上】【PL/SQL】【存储过程】【存储函数】【触发器】

    一.PL/SQL简介 1.概念:PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言. 2.功能:既能够实现对数据库的操作,也能够通过过程化语言中的 ...

  9. 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】

    一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...

随机推荐

  1. [转] form.getForm().submit的用法及Ext.Ajax.request的小小区别

    原文地址:http://blog.csdn.net/hongleidy5000/article/details/7329325 if (!formDetail.getForm().isValid()) ...

  2. PyChram中同目录下import引包报错的解决办法?

    相信很多同学和我一样在PyChram工具中新建python项目的同目录下import引包会报错提示找不到,这是因为该项目找不到python的环境导致的: 如果文件开始的时候包引包的错误可以,都可以用用 ...

  3. 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. MySQL视图

    什么是视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 理解:使用SQL语句获取的结果, ...

  5. C#把DataTable中数据一次插入数据库的方法

    现在实际的情况是这样的: 客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Access数据库中的打卡数据同步到SQL Server数据库 ...

  6. OC JS交互(通常情况下,如果网页写得正规的话,是可以正常交互的,之前就遇到后台写h5始终拿不到事件,元素也拿不到,更别说交互了,真是奇了怪了)

    自动填充表单 @"document.getElementById('loginid').value = '这里填入你的用户名';document.getElementById('userpa ...

  7. Protecting against XML Entity Expansion attacks

    https://blogs.msdn.microsoft.com/tomholl/2009/05/21/protecting-against-xml-entity-expansion-attacks/ ...

  8. B:Wordpress不同分类调用不同的模板

    这里指的是默认文章类型的模板(single.php,category.php) 应用场景: 默认文章默认有2个大类(新闻资讯.游戏资料) 新闻资讯下的所有子分类调用"新闻资讯列表模板,新闻内 ...

  9. 7 款顶级开源 BI(商务智能)软件和报表工具

    在这个信息化时代,每分每秒都产生海量数据.在海量数据中,挖掘出有用的数据,并且能以较人性化.直观的方式展示这些数据,变得尤为重要.本文将介绍 7款顶级开源 BI(商务智能)软件和报表工具,用于商业数据 ...

  10. PHP计算两个时间段是否有交集(边界重叠不算)

    优化前的版本: /** * PHP计算两个时间段是否有交集(边界重叠不算) * * @param string $beginTime1 开始时间1 * @param string $endTime1 ...