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();
}
}
}
java程序调用存储过程的更多相关文章
- java程序调用存储过程和存储函数
java程序调用存储过程 jdbcUtil.java文件 package cn.itcast.oracle.utils; import java.sql.Connection; import java ...
- 通过java程序调用ant build.xml配置文件中指定的target
一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...
- Java JDBC调用存储过程:无参、输入带参、输出及输出带参
Java JDBC调用存储过程:无参.输入带参.输出及输出带参 示例代码: package xzg; import java.sql.CallableStatement; import java.sq ...
- 【原】Java程序调用远程Shell脚本
此程序的目的是执行远程机器上的Shell脚本. [环境参数]远程机器IP:192.168.234.123用户名:root密码:rootShell脚本的路径:/home/IFileGenTool/Bak ...
- Java程序调用带参数的shell脚本返回值
Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: - \)$ Shell本身的PID(ProcessI ...
- java 通过调用存储过程获取结果集
一般在java中,数据查询是通过Statement, PreparedStatement获取结果集,今天向大家介绍通过CallableStatement调用存储过程,从而获取结果集. 本 ...
- Java代码调用存储过程和存储方法
准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: package com.test.d ...
- 转载:java程序调用内存的变化过程
前文知道了java程序运行时在内存中的大概分布,但是对于具体程序是如何运行的,看到一篇文章,直接转载过来. (一)不含静态变量的java程序运行时内存变化过程分析 代码: package oop; / ...
- java程序调用kettle
(1).将相应的kettle的jar包导入的java项目,主要的jar包有一下几个. (2).java程序. package cn.com.taiji.oosweb.test.web; import ...
随机推荐
- flush vs ob_flush
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等).该函数将当前为止程序的所有输出发送到用户的浏览器. flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响. ...
- Flink - state管理
在Flink – Checkpoint 没有描述了整个checkpoint的流程,但是对于如何生成snapshot和恢复snapshot的过程,并没有详细描述,这里补充 StreamOperato ...
- 【翻译】How To Tango With Django 1.5.4 第二章
2.开始吧! 准备好两个关键的安装包 Python version 2.7.5 Django version 1.5.4 2.1熟悉你自己的系统(我的是windows) 略 2.2安装软件 2.2.1 ...
- 使用apache.lang包安全简洁地操作Java时间
引言 最近偶遇apache开发的工作java工具包,一使用,就发现自己爱上它了.不多说了,下面介绍org.apache.commons.lang3.time包中处理java程序员为之头疼的时间的类. ...
- 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码
前面几篇发布了一些有关五子棋的基本算法,其中有一些BUG也有很多值得再次思考的问题,在框架和效果上基本达到了一个简单的AI的水平,当然,我也是初学并没有掌握太多的高级技术.对于这个程序现在还在优化当中 ...
- zepto源码--核心方法7(管理包装集)--学习笔记
后面应该会有几篇连续介绍关于zepto包装集的文章.涉及的函数较多,就分别介绍,今天介绍几个使用关系获取包装集的方法.prev, next, first, last, siblings, eq pre ...
- PHP 多维数组 Key Value的使用
<?php $user["60"] = array("id" => "60", "num" => &q ...
- LeetCode Factor Combinations
原题链接在这里:https://leetcode.com/problems/factor-combinations/ 题目: Numbers can be regarded as product of ...
- Python之路-python(面向对象一)
一.面向对象介绍 二.为什么要用面向对象开发 三.封装.继承.多态.类.方法 面向过程和面向对象的区别 编程范式: 一般情况下,拿到一个项目不同的两个人有不同的编写方式(相同的是固定的语法.数据结构) ...
- 让Placeholder在IE中燥起来
网上有好多关于这方面解决兼容性问题的文章,很多招式,学会这一招,让你轻松搞定Placeholder的兼容性,叫我好人,拿走,不谢.... placeholder属性是HTML5 中为input添加的. ...