一、Java调用存储Oracle存储过程

  测试用表:  

--创建用户表
create table USERINFO
(
username VARCHAR2(50) not null,
password VARCHAR2(50) not null,
email VARCHAR2(50) not null
)

  1、调用输入参数的存储过程,无返回值

--添加用户记录
create or replace procedure pro_userinfo_insert(username VARCHAR2,password VARCHAR2,email VARCHAR2) is
begin
INSERT INTO userinfo VALUES(username,password,email);
COMMIT;
end pro_userinfo_insert;

  调用

//省略jdbc其他代码

//调用存储过程
CallableStatement call = con.prepareCall("{call pro_userinfo_insert(?,?,?)}");
//传递参数
call.setString(1, "wangwu");
call.setString(2, "123123");
call.setString(3, "wangwu@163.com");
//执行方法,调用存储过程
int result = call.executeUpdate();
//返回受影响的行数
System.err.println(result);

  2、调用带输出参数的存储过程,返回单个值

--获取用户的记录总数
create or replace procedure pro_userinfo_SelectCount(
v_count OUT INT
)is
begin
SELECT COUNT(*) INTO v_count FROM Userinfo;
end pro_userinfo_SelectCount;

  调用代码

//调用存储过程
CallableStatement call = con.prepareCall("{call pro_userinfo_selectcount(?)}");
//传递参数
call.registerOutParameter(1, Types.INTEGER);
call.execute();
System.out.println(call.getInt(1));

  注意,这里的proc.getInt(1)中的数值1并非任意的,而是和存储过程中的out列对应的,如果out是在第二个位置,那就是proc.getInt(2),如果是第三个位置,就是proc.getInt(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

  

  3、返回列表的存储过程

  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。

  创建游标类型:

--声明一个包,在包中声明公共的游标类型
create or replace package shop_package IS
--声明一个游标类型
TYPE ref_cursor IS REF CURSOR;
end shop_package;

  创建带游标的存储过程:

--带输出游标的存储过程,参数类型为刚才创建的包中的游标类型
create or replace procedure pro_userinfo_select(cur OUT shop_package.ref_cursor) is
begin
--游标进行绑定查询的sql语句
OPEN cur FOR SELECT * FROM userinfo;
end pro_userinfo_select;

  Java调用代码

//调用存储过程
CallableStatement call = con.prepareCall("{call pro_userinfo_select(?)}");
//设置输出参数类型为游标类型
call.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
call.execute();
//将游标类型转换为数据集,然后遍历数据集即可
ResultSet rs = (ResultSet) call.getObject(1);
System.out.println("姓名\t\t邮箱");
while(rs.next()){
System.out.println(rs.getString(1) + "\t\t" + rs.getString(3));
}

二、Java调用函数

  1、调用函数,返回单个值

--根据用户名称获取Email函数,返回字符串格式
create or replace function fun_userinfo_selectEmail(v_username varchar2)
return varchar2
is
v_email VARCHAR2(50);
begin
SELECT email INTO v_email FROM Userinfo WHERE username=v_username;
return(v_email);
end fun_userinfo_selectEmail;

  Java调用

//调用函数
CallableStatement call = con.prepareCall("{?=call fun_userinfo_selectemail(?)}"); //这里必须使用{},否则会报错!
//设置参数,1为函数返回值,2为传递到函数中的参数
call.registerOutParameter(1, Types.VARCHAR);
call.setString(2, "zhangsan");
call.execute();
System.out.println(call.getString(1));

  2、调用返回游标的函数

--返回游标类型的函数,游标为前面在包中定义的游标类型
create or replace function fun_userinfo_select return shop_package.ref_cursor is
ref_cur shop_package.ref_cursor;
begin
OPEN ref_cur FOR SELECT * FROM userinfo;
return(ref_cur);
end fun_userinfo_select;

  Java调用

//调用函数
CallableStatement call = con.prepareCall("{?=call fun_userinfo_select()}");
//设置返回值类型为游标
call.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
call.execute(); ResultSet rs = (ResultSet) call.getObject(1);
System.out.println("姓名\t\t邮箱");
while(rs.next()){
System.out.println(rs.getString(1) + "\t\t" + rs.getString(3));
}

Java 调用存储过程、函数的更多相关文章

  1. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  2. clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import jav ...

  3. Oracle数据库基本操作 (五) —— 使用java调用存储过程

    一.环境准备 登录Oracle数据库scott账号,利用emp进行操作. 1.创建 proc_getyearsal 存储过程 -- 获取指定员工年薪 create or replace procedu ...

  4. OTL调用存储过程/函数及注意事项

    OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库. OTL  ...

  5. java调用存储过程(stored procedures)的HelloWorld例子

    1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...

  6. java调用存储过程和函数

    以对表test进行增,删,改,查进行说明:1.新建表test create table TEST ( TID NUMBER not null, TNAME VARCHAR2(32), TCODE VA ...

  7. 【转】java调用存储过程和函数

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  8. java调用存储过程、存储函数

    需要用到的接口 接口 CallableStatement JDK文档对改接口的说明: public interface CallableStatement extends PreparedStatem ...

  9. java调用存储过程

    在做java调用sqlserver存储过程时遇到了各种各样的问题,不过在不懈的努力之下这些问题还是得以解决了.今天总结一下遇到的问题以及解决的方法. 首先调用存储过程的方法大家都很清楚: String ...

随机推荐

  1. 51Nod 1601 完全图的最小生成树计数

    题目链接 分析: 这是一张完全图,并且边的权值是由点的权值$xor$得到的,所以我们考虑贪心的思想,考虑$kruskal$的过程选取最小的边把两个连通块合并,所以我们可以模仿$kruskal$的过程, ...

  2. OpenGL入门学习(一)(转)--环境搭建

    http://blog.chinaunix.net/uid-20622737-id-1912797.html 说起编程作图,大概还有很多人想起TC的#include <graphics.h> ...

  3. 2017网易---Fibonacci数列

    题目描述 Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, ...

  4. 我们为什么需要 lock 文件

    前言 从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可.本篇文章想从前端视角探讨一下我们为什么需要 ...

  5. 【linux高级程序设计】(第九章)进程间通信-管道 1

    Linux操作系统所支持的主要进程间的通信机制. 无名管道 PIPE cat test.txt| grep hello 上面这种管道,将一个命令的输出作为另一个命令的输入,而这种管道是临时的,命令执行 ...

  6. python接口自动化10-token登录【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E ...

  7. pythontips(2):hasattr的用法

    class Xiaorui: def __init__(self): self.name = 'xiaorui' def setName(self, name=''): if name.strip() ...

  8. 如何将django部署从顶级目录迁移到子目录下(NGINX UWSGI DJANGO)

    因为公司网站合并,要将我们的DJANGO项目从IP的顶级目录迁移到域名的二级目录. 以前硬编码的URL可惨了. 还涉及到upload目录,静态目录,websocket目录. 全用{% url %}问题 ...

  9. (6)C#方法,作用域,方法重载

    1.方法 返回类型 方法名(参数列表) 例如:int a(int b,int c) { 方法体 return b+c; } 函数如果有返回类型则最后要用return一个和返回类型一样的数据. 2.无返 ...

  10. 陕西师范大学第七届程序设计竞赛网络同步赛 I 排队排队排队【数组任一位可以移动到队头,最少移动几次增序/数组指针操作】

    链接:https://www.nowcoder.com/acm/contest/121/I来源:牛客网 题目描述 ACM竞赛队内要开运动会啦!!!! 竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站 ...