1. 步骤:

    JDBC调用存储过程和函数

    步骤:

    ①:通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例,在使用Connection对象的preparedCall()方法时,需要传入一个String类型的字符串,该字符串指明如何调用存储过程。

    函数: [? = call [(,, … )]]

    存储过程: [call [(,, … )]]

    ②:通过CallableStatement对象reisterOutParameter方法注册OUT参数

    ③:通过CallableStatement对象setXxx()方法设定IN或IN OUT参数,若想把参数设为null,使用setNull()方法

④:通过CallableStatement对象的execute()方法执行存储过程。

⑤:如果调用的是带返回值的存储过程,还需要CallableStatement对象的getXxx()方法获取其返回值。

注:通过数据字典查看存储过程或函数的定义。

2 .示例代码

java调用存储过程

    /**
* 调用存储过程
*/
@Test
public void testCallableStatement(){
Connection conn = null;
CallableStatement callablestatement = null;
try {
conn = TestTools.getConnection();
String sql = "{ call add0 (?, ?, ?) }";
//1.获取CallableStatement类是对象
callablestatement = conn.prepareCall(sql);
//2.注册OUT参数
callablestatement.registerOutParameter(3, Types.NUMERIC);
//3.通过setXxx()方法设定IN或OUT参数值
callablestatement.setInt(1, 10);
callablestatement.setInt(2, 20);
//4.执行存储过程
callablestatement.execute();
//5.若有返回值,需要使用getXxx()接收
int sum = callablestatement.getInt(3);
System.out.println("结果:"+sum);//结果:30
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(callablestatement, conn);
}
}

创建存储过程的SQL语句

#定义有返回值的存储过程,大小写无所谓,功能:计算两个数的值
#注意:过程名不能使用add CREATE PROCEDURE add0(IN a INT,IN b INT,OUT result INT)
BEGIN
IF a IS NULL THEN SET a = 0;
END IF;
IF b IS NULL THEN SET b = 0;
END IF;
SET result = a + b;
SELECT result AS SUM;
END; #调用存储过程 call add0 (10, 20, @result); ##定义无返回值的存储过程,大小写无所谓,功能:计算两个数的值 CREATE PROCEDURE add1( a INT, b INT)
BEGIN
DECLARE result INT;
IF a IS NULL THEN SET a = 0;
END IF;
IF b IS NULL THEN SET b = 0;
END IF;
SET result = a + b;
SELECT result AS SUM;
END; #调用存储过程 call add1 (10, 20);

java调用函数

    /**
* 调用函数
*/
@Test
public void testCallableStatement1(){
Connection conn = null;
CallableStatement callablestatement = null;
try {
conn = TestTools.getConnection();
String sql = "{? = call add_fun (?, ?) }";
//1.获取CallableStatement类是对象
callablestatement = conn.prepareCall(sql);
//2.注册OUT参数,其中1表示第一个问号,表示输出
callablestatement.registerOutParameter(1, Types.NUMERIC);
//3.通过setXxx()方法设定IN或OUT参数值,2,3表示第二个和第三个问号,表述输入。
callablestatement.setInt(2, 10);
callablestatement.setInt(3, 20);
//4.执行存储过程
callablestatement.execute();
//5.若有返回值,需要使用getXxx()接收
int sum = callablestatement.getInt(1);
System.out.println("结果:"+sum);
} catch (Exception e) {
e.printStackTrace();
}finally{
TestTools.release(callablestatement, conn);
}
}

创建函数的mysql语句:

#创建有返回值的函数,注意分号不要少

create function add_fun(a int, b int)
returns int
begin declare c int;
set c = a + b;
return c;
end; #调用函数 select add_fun(10,10) as sum

JDBC(13)—JDBC调用存储过程和函数的更多相关文章

  1. Java 调用存储过程、函数

     一.Java调用存储Oracle存储过程 测试用表: --创建用户表 create table USERINFO ( username ) not null, password ) not null ...

  2. 转:EF调用存储过程、函数

    EF调用存储过程.函数 2014-04-02 09:12:20|  分类: ORM框架|举报|字号 订阅          一.ef4.1 codeFirst 修改表结构 增加字段等 EF code ...

  3. MySQL学习笔记:调用存储过程或函数报1418错误

    问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...

  4. JDBC第二篇--【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 1.PreparedStatement对象 PreparedState ...

  5. JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】

    1.PreparedStatement对象 PreparedStatement对象继承Statement对象,它比Statement对象更强大,使用起来更简单 Statement对象编译SQL语句时, ...

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

    1.调用存储过程 public class CallOracleProc { public static void main(String[] args) throws Exception{ Stri ...

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

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

  8. MyBatis中调用存储过程和函数

    一.调用存储过程 1.首先在数据库中定义存储过程,定义的存储过程的代码如下: //定义存储过程 create or replace procedure pag_add(p1 varchar2,p2 v ...

  9. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

随机推荐

  1. 【CF446D】DZY Loves Games

    题解: 不错的题目 首先要求的黑点个数非常多 比较容易想到矩阵乘法 于是我们可以求出从某个黑点出发到任意一个黑点之间的概率 发现不同出发点带来的变化只有常数项 于是我们可以预处理出从每个方程转移的系数 ...

  2. struts2远程命令执行漏洞S2-045

    Apache Struts2最新漏洞(CVE-2017-5638,S02-45) struts2远程命令执行漏洞S2-045 Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-04 ...

  3. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  4. javascript监听数组变化

    , ]; ); , ]; ); , ]; ); ]; , ]; ); ); ); break; } if (inserted) { ob.observeArray(inserted); } // 通知 ...

  5. Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)

    Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)    转 https://blog.csdn.net/lhl1124281072/article/details/800 ...

  6. Python并发复习4- concurrent.futures模块(线程池和进程池)

    Python标准库为我们提供了threading(多线程模块)和multiprocessing(多进程模块).从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提 ...

  7. iframe实现伪ajax

    iframe实现伪ajax 数据提交的两种方式: Form Ajax Ajax提交数据的方法: JS实现 Jquery “伪”Ajax "伪"Ajax: iframe+from实现 ...

  8. P2158 [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队图是关于y=x对称的,横纵坐标一定是互质的否则在之前就被扫过了,所以就可以用欧拉函数再*2就完了. #include<iostream> #inclu ...

  9. python 词云小demo

    词云小demo jiebawordcloud 一 什么是词云? 由词汇组成类似云的彩色图形.“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过 ...

  10. 说说我安装pyspider遇到的那些坑

    现在python3.7  >>pip install pyspider    配置环境变量 前置的phantomjs 无界面浏览器,设置就不说了 cmd 中运行pyspider all  ...