java程序调用存储过程

 

    PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程。下面我们介绍下使用java调用Oracle的存储过程。

 

  准备代码:

package com.mscncn.plsql.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class DBUtil {
static{
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static Connection getConntection(){
Connection ct=null;
try {
ct = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.25:1521:oracle",
"scott", 
"scott");
} catch (SQLException e) {
e.printStackTrace();
}
return ct;
}
}

 

create or replace package pro_pk is
   type pager_cursor is ref cursor;
   procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2);
   procedure delete_dept(dept_no in number,num out number);
end pro_pk; create or replace package body pro_pk is
   procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2)
     is
         exp_remaining exception;
         pragma exception_init(exp_remaining,-1);/*非预定义错误,-1是违反唯一约束*/
     begin 
       insert into dept values(dept_no,dept_name,location);
       if sql%found then /*隐式游标,sql*/
         return 1;
       else 
         return 0;
       end if;
     exception 
       when exp_remaining then
         dbms_output.put_line('违反唯一约束.');
     end add_dept;
       
     procedure delete_dept(dept_no in number,num out number)
       is
     begin 
         delete from dept where deptno=dept_no;
         if sql%found then 
           num:=1;
         else 
           num:=1;
         end if;
     end delete_dept;
end pro_pk;
 create or replace package pageUtil is
 
  type page_cursor is ref cursor;--定义一个游标类型
  
  procedure pager(
        tName in varchar2, --表名
        pageNum in number, --页数
        pageSize in number,--每页记录数
        totalRecord out number,--总记录数
        totalPage out number,--总页数
        p_cursor out page_cursor);
        
end pageUtil; create or replace package body pageUtil is 
       
    procedure pager(
        tName in varchar2, --表名
        pageNum in number, --页数
        pageSize in number,--每页记录数
        totalRecord out number,--总记录数
        totalPage out number,--总页数
        p_cursor out page_cursor) is
        
        --定义sql语句字符串
        v_sql varchar2(1000);
        --分页开始位置,与结束位置
        v_begin number:=(pageNum-1)*pageSize+1;
        v_end number:=pageNum*pageSize;
    begin
      v_sql:='select * from ( select t.*,rownum rn from '
        ||tName||' t where rownum<='||v_end||') where rn>='||v_begin;
      --把游标和sql关联
      dbms_output.put_line(v_sql);
      open p_cursor for  v_sql;
      --计算totalRecord与totalPage
      v_sql:='select count(*) from '||tName;
      --
      execute immediate v_sql into totalRecord;
      if mod(totalRecord,pageSize)=0 then 
        totalPage:=totalRecord/pageSize;
      else
        totalPage:=totalRecord/pageSize+1;
      end if;
      --关闭游标,这儿需要注意,如果我们在java程序中使用cursor,那么就一定不能关闭cursor
      --否则关闭cursor后,java程序中返回的结果集就是null
      --close p_cursor;
    end pager;
end pageUtil;

1. java调用没有返回值的存储过程。

/**
 * java调用没有返回值的存储过程
 */
@Test
public void proNoReulstTest(){
Connection ct=DBUtil.getConntection();
try {
CallableStatement cs=ct.prepareCall("{call pro_pk.add_dept(?,?,?)}");
cs.setInt(1, 13);
cs.setString(2, "java开发部");
cs.setString(3, "中国信阳");
cs.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

2. java程序调用有返回值的存储过程

/**
 * java调用有返回值的存储过程(返回值类型为number)
 */
@Test
public void proHasReulstTest(){
Connection ct=DBUtil.getConntection();
try {
CallableStatement cs=ct.prepareCall("{call pro_pk.delete_dept(?,?)}");
cs.setInt(1, 13);
//注册第二个参数为存储过程的返回值
cs.registerOutParameter(2, OracleType.STYLE_INT);
cs.execute();
//通过参数的索引,来获取存储过程的返回值,索引从1开始
int num=cs.getInt(2);
System.out.println(num==1?"删除成功":"删除失败");
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

3. java程序调用存储过程返回值为游标

/**
 * 存储过程返回一个游标
 */
@Test
public void proReturnCursorTest(){
Connection ct=DBUtil.getConntection();
try {
CallableStatement cs=ct.prepareCall("{call pageUtil.pager(?,?,?,?,?,?)}");
cs.setString(1, "emp");
cs.setInt(2, 2);
cs.setInt(3, 5);
cs.registerOutParameter(4, OracleTypes.NUMBER);
cs.registerOutParameter(5, OracleTypes.NUMBER);
cs.registerOutParameter(6, OracleTypes.CURSOR);
cs.execute();
//通过参数的索引,来获取存储过程的返回值,索引从1开始
int totalRecord=cs.getInt(4);
int totalPage=cs.getInt(5);
ResultSet rs=(ResultSet)cs.getObject(6);
System.out.println("总记录数为:"+totalRecord+",总页数为:"+totalPage);
while(rs.next()){
System.out.println("雇员编号:"+rs.getInt("empno")+",雇员姓名:"+rs.getString("ename"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

 

© 著作权归作者所有

java程序调用存储过程的更多相关文章

  1. java程序调用存储过程和存储函数

    java程序调用存储过程 jdbcUtil.java文件 package cn.itcast.oracle.utils; import java.sql.Connection; import java ...

  2. 通过java程序调用ant build.xml配置文件中指定的target

    一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...

  3. Java JDBC调用存储过程:无参、输入带参、输出及输出带参

    Java JDBC调用存储过程:无参.输入带参.输出及输出带参 示例代码: package xzg; import java.sql.CallableStatement; import java.sq ...

  4. 【原】Java程序调用远程Shell脚本

    此程序的目的是执行远程机器上的Shell脚本. [环境参数]远程机器IP:192.168.234.123用户名:root密码:rootShell脚本的路径:/home/IFileGenTool/Bak ...

  5. Java程序调用带参数的shell脚本返回值

    Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: -  \)$  Shell本身的PID(ProcessI ...

  6. java 通过调用存储过程获取结果集

    一般在java中,数据查询是通过Statement, PreparedStatement获取结果集,今天向大家介绍通过CallableStatement调用存储过程,从而获取结果集.        本 ...

  7. Java代码调用存储过程和存储方法

    准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: package com.test.d ...

  8. 转载:java程序调用内存的变化过程

    前文知道了java程序运行时在内存中的大概分布,但是对于具体程序是如何运行的,看到一篇文章,直接转载过来. (一)不含静态变量的java程序运行时内存变化过程分析 代码: package oop; / ...

  9. java程序调用kettle

    (1).将相应的kettle的jar包导入的java项目,主要的jar包有一下几个. (2).java程序. package cn.com.taiji.oosweb.test.web; import ...

随机推荐

  1. Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理

    Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...

  2. PHP 多维数组 Key Value的使用

    <?php $user["60"] = array("id" => "60", "num" => &q ...

  3. rndc控制远程dns服务器配置方法

    1- 如果不存在/etc/rndc.conf touch /etc/rndc.conf chown named:named /etc/rndc.conf 2- rndc-confgen > /e ...

  4. iOS小技巧3

    将颜色合成图片 将颜色合成图片 +(UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1 ...

  5. python install (version problem-method ln -s)

    一般情况下,无需自己安装Python.因为在大多数Linux版本中,如Fedora,Ubuntu等,都已经默认安装了Python,但也可以根据需要自定义安装Python.下面使用源码编译安装来举个例子 ...

  6. TCP/IP详解--连接状态变迁图CLOSE_WAIT

    终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭 ...

  7. Android – 学习操作NFC – 2

    在<Android – 学习操作NFC – 1>说明了Android在处理NFC tag的机制.tag dispatch system的运作流程,以及三种ACTION_NDEF_DISCO ...

  8. 在linux中安装adb和fastboot工具

    我用的是archlinux,在官方的软件仓库里就可以找到对应的包,包的名字叫:android-tools 据说debian系列的软件包是两个,分别是:android-tools-adb, androi ...

  9. animation 的属性一共有 6 个值,详细介绍在此

    animation 属性是一个简写属性,用于设置六个动画属性: animation-name animation-duration animation-timing-function animatio ...

  10. CentOS7下安装Mysql和Memcached 以及 使用C#操作Mysql和Memcached

    我本身是学.net的,但是现在很多主流SQL和NOSQL都是部置在linux下,本着好学的精神,前段时间装了个虚拟机,在其装上CentOS64位的服务器系统,对于英文0基础,linux0基础的我来说, ...