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. 14交互活动:XHTML表单

    表单基本上就是带有一块输入信息区域的网页.当提交表单时,表单中的信息被打成一个数据包发送给web服务器,web应用程序对之经行处理.处理完成后,可以获得另一个相应页面. 使用<form>元 ...

  2. 【转】arcgis server site 快速恢复与重建

    作者:suwenjiang 出处:http://www.cnblogs.com/myyouthlife/ 具体链接:http://www.cnblogs.com/myyouthlife/p/48985 ...

  3. web页面隐藏鼠标

    Java web项目需求需要做一个在页面中,鼠标隐藏,来浏览页面,让客户不能点金页面 重要代码: $('*').css('cursor','none!important'); 示例: <styl ...

  4. LightOj 1278 - Sum of Consecutive Integers(求奇因子的个数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1278 题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示; 例 ...

  5. 将IIS 7,IIS 8运行在32位

    win2008及win2012的IIS运行在32状态下,原因是ASP程序必须在32位下才能使用ACCESS, 只有在32位下,myodbc才会正常,注意,MySQL必须用32位版本. 设置办法: 打开 ...

  6. [转] PHP计算两个坐标之间的距离, Calculate the Distance Between Two Points in PHP

    Calculate the Distance Between Two Points in PHP There are a lot of applications where it is useful ...

  7. raw socket

    一个很newbee的例子,可惜还得改 import sys import time import socket import struct import random def SendPacketDa ...

  8. 产品Backlog

    产品BACKLOG ID Name Imp Est How to demo Notes 1 界面(首页.订单.资料) 50 2 进入界面,选择需要的界面 使用分栏界面 2 首页里的功能按钮 40 6 ...

  9. Leetcode: Reconstruct Original Digits from English

    Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ...

  10. url传值错误

    ValueError at /add/ invalid literal for int() with base 10: ''6'' Request Method: GET Request URL: h ...