java程序调用存储过程

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();
			}
		}
	}


时间: 2024-10-05 08:45:27

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

mysql创建 存储过程 并通过java程序调用该存储过程

create table users_ning(id primary key auto_increment,pwd int); insert into users_ning values(id,1234); insert into users_ning values(id,12345); insert into users_ning values(id,12); insert into users_ning values(id,123); CREATE PROCEDURE login_ning(

C#中参数化命令及程序调用存储过程

1.using(要释放的对象 对象名=new 要释放的对象()){}2.设置参数化命令,避免sql注入 2.1 设置占位符[不要写单引号,名字尽量和字段名保持一致,like时 '%'[email protected]名字+'%'] 2.2 创建SqlParameter对象,给占位符赋值,可以创建单个对象或者数组对象 2.3 command对象的Parameters添加 Add或者AddRange3.程序调用存储过程 3.1 sql语句替换成存储过程名字 3.2 command的CommandTy

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

此程序的目的是执行远程机器上的Shell脚本. [环境参数]远程机器IP:192.168.234.123用户名:root密码:rootShell脚本的路径:/home/IFileGenTool /BakProvisionAndOccurEntrance.sh [具体步骤]1.在远程机器上,准备Shell脚本.[[email protected] IFileGenTool]# vim ./load_data.sh 1 #!/bin/sh 2 source /etc/profile 3 dbName

SAP RFC 函数创建 Java程序调用 学习总结 一步一步图文并茂

前言 公司即将接到一个项目与SAP有接口.老大让我们搞SAP,首先SAP接触过,但是没玩过开发,本周就专心的在研究这一块. 各种碰壁,SAP的系统让我怎么说呢? 算了,说多了都是泪,下面附上本周学习成果,大家一起探讨一下,ABAP 还得多学学. Package (tcode:se80) 输入需要创建的 Package ,例:ZTP (之前用T打头测试,貌似不行,大家可以试试) 点  Yes 创建. 输入创建Package的信息. Table (tcode:se11) 点击Create. 点击保存

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

准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: [java] view plain copy print? package com.test.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; i

JAVA-JNI java程序调用c/c++程序

目的:写c/c++函数,让java调用 java代码 1.创建HelloJNI.java文件->编写代码如下->cmd中javac HelloJNI.java获取HelloJNI.class文件 public class HelloJNI { public native void display();//native申明函数是它语言实现 static {//表示静态语句块 System.loadLibrary("HelloDll");//表示加载动态链接库HelloDll库

java程序调用xfire发布的webService服务(二)

在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端. 因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下: 一.测试向服务端传递字符串(重点在第二个): 为了进一步理解服务搭建,我重新写了一个服务端服务类: 接口: package xfireTest; public interface XFire

解决java在调用存储过程中需要传递clob字段时存在问题

在迁移系统到别的服务器的时候出现了一个神秘的问题: 在本地开发和其他服务器上部署系统的时候,使用相同的JDK.ORACLE驱动.TOMCAT,其中又一个操作是调用oracle数据库的存储过程,需要传递一个clob类型的入参,在本地测试没有问题,上传到服务器时就没法执行通过以下代码段,并且也没有抛异常: String wkt = "..."; Clob clobWkt = conn.createClob(); clobWkt.setString(1, wkt); cs.setClob(1

windows下流媒体nginx-rmtp-module服务器搭建及java程序调用fmpeg将rtsp转rtmp直播流

第一步:首先介绍一下所用相关技术 注:项目中使用的jwplayer插件,不支持rtsp协议,所以使用以下技术来进行转艺 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.在这里我只用到了它的视屏格式转换功能,将rtsp协议的视频流转成rtmp Rtsp协议(实时流传输协议):  公司用的是海康的监控地址为(rtsp://admin:[email protected]/h264/ch1/main/av_stream) 3. Rtmp协议(实时消息传输协议 ):