Using JDBC CallableStatements to Execute Stored Procedures

Connector / J完全实现了 java.sql.CallableStatement接口。

Connector / J通过JDBC CallableStatement接口公开存储过程功能。

以下示例显示了一个存储过程,该存储过程返回inOutParam递增1 的值,并将使用的字符串inputParam作为 ResultSet

Connector / J:调用存储过程

 CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), \
INOUT inOutParam INT)
BEGIN
DECLARE z INT;
SET z = inOutParam + 1;
SET inOutParam = z; SELECT inputParam; SELECT CONCAT('zyxw', inputParam);
END

要使用demoSpConnector / J 的过程,请按照下列步骤操作:

1、使用准备可调用语句 Connection.prepareCall()

请注意,您必须使用JDBC转义语法,并且参数占位符周围的括号不是可选的:

Connector / J:使用 Connection.prepareCall()

 import java.sql.CallableStatement;

 ...

     //
// Prepare a call to the stored procedure 'demoSp'
// with two parameters
//
// Notice the use of JDBC-escape syntax ({call ...})
// CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}"); cStmt.setString(1, "abcdefg");

2、注册输出参数(如果存在)

要检索输出参数(参数指定的值,OUT或 INOUT在创建存储过程),JDBC要求他们执行语句之前,使用各种指定 registerOutputParameter()的方法CallableStatement接口:

Connector / J:注册输出参数:

 import java.sql.Types;
...
//
// Connector/J supports both named and indexed
// output parameters. You can register output
// parameters using either method, as well
// as retrieve output parameters using either
// method, regardless of what method was
// used to register them.
//
// The following examples show how to use
// the various methods of registering
// output parameters (you should of course
// use only one registration per parameter).
// //
// Registers the second parameter as output, and
// uses the type 'INTEGER' for values returned from
// getObject()
// cStmt.registerOutParameter(2, Types.INTEGER); //
// Registers the named parameter 'inOutParam', and
// uses the type 'INTEGER' for values returned from
// getObject()
// cStmt.registerOutParameter("inOutParam", Types.INTEGER);
...

3、设置输入参数(如果存在)

输入和输入/输出参数设置为 PreparedStatement对象。但是, CallableStatement还支持按名称设置参数:

Connector / J:设置CallableStatement输入参数:

 ...

     //
// Set a parameter by index
// cStmt.setString(1, "abcdefg"); //
// Alternatively, set a parameter using
// the parameter name
// cStmt.setString("inputParam", "abcdefg"); //
// Set the 'in/out' parameter using an index
// cStmt.setInt(2, 1); //
// Alternatively, set the 'in/out' parameter
// by name
// cStmt.setInt("inOutParam", 1); ...

4、执行CallableStatement,并检索任何结果集或输出参数。

虽然CallableStatement支持调用任何Statement执行方法(executeUpdate(), executeQuery()或 execute()),但最灵活的调用方法是execute(),因为如果存储过程返回结果集,则不需要提前知道:

Connector / J:检索结果和输出参数值

 ...

     boolean hadResults = cStmt.execute();

     //
// Process all returned result sets
// while (hadResults) {
ResultSet rs = cStmt.getResultSet(); // process result set
... hadResults = cStmt.getMoreResults();
} //
// Retrieve output parameters
//
// Connector/J supports both index-based and
// name-based retrieval
// int outputValue = cStmt.getInt(2); // index-based outputValue = cStmt.getInt("inOutParam"); // name-based ...

参考链接:

https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-statements-callable.html

使用JDBC CallableStatements执行存储过程的更多相关文章

  1. JAVA使用JDBC技术操作SqlServer数据库执行存储过程

    Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带 ...

  2. JDBC连接执行MySQL存储过程报权限错误

    今天在测试项目的时候  突然就报了一个错出来. User does not have access to metadata required to determine stored procedure ...

  3. JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted,

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  4. JDBC连接执行mysql存储过程报权限错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted,

    分析:JDBC在调用存储过程时不光用户要有execute的权限,还需要对mysql.proc具有访问权限.否则它无法访问metadata 解决方案:给数据库用户赋权,赋执行mysql.proc表的se ...

  5. Jdbc执行存储过程报数据库事务无法执行的异常

    Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...

  6. 原生jdbc执行存储过程

    //定时任务,结转 . //表名 fys_sch_lvyou2 ,存储过程名:fys_sch_lvyou2_carrayover //无参调用:{call insertLine} //有参调用:{ca ...

  7. JDBC执行存储过程的四种情况 (转)

    本文主要是总结 如何实现 JDBC调用Oracle的存储过程,从以下情况分别介绍: [1].只有输入IN参数,没有输出OUT参数 [2].既有输入IN参数,也有输出OUT参数,输出是简单值(非列表) ...

  8. JDBC使用MySQL存储过程错误

    JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedur ...

  9. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

随机推荐

  1. 吴裕雄--天生自然 JAVA开发学习:Number & Math 类

    int a = 5000; float b = 13.65f; byte c = 0x4a; public class Test{ public static void main(String arg ...

  2. 题解 P2738 【[USACO4.1]篱笆回路Fence Loops】

    这题是我期中测试的一题水题,然而英文题目太长了不想读...后面考完被同学提醒后20分钟切了(心塞) 切完看了波题解,发现貌似我的方法跟大家都不一样呢... 常规做法: \(Floyd\) 这个有三页的 ...

  3. mybatis的XML配置文件中,typeHandler、jdbcType、javaType的使用

    1.前言 typeHandler.jdbcType.javaType都是用来处理java数据类型和jdbc数据库数据类型的转换问题,但在xml的不同位置使用需要注意引号使用问题. 2.在xml的不同位 ...

  4. c语言中常用的串运算

    调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from) 串连接,strca ...

  5. python-day4爬虫基础之正则表达式

    正则表达式:(字符串匹配) 使用单个字符串来描述匹配一系列符合某个句法规则的字符串 是对字符串操作的一种逻辑公式 应用场景:处理文本和数据 正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个 ...

  6. Travelling Businessmen Problem

    Travelling Businessmen Problem 先求出图的两个部分,可能只有一个部分 然后用set模拟,得到不同部分差最小的 #include <bits/stdc++.h> ...

  7. Vue环境搭建-项目的创建-启动生命周期-组件的封装及应用

    vue项目环境的搭建 """ node >>> python:node是用c++编写用来运行js代码的 npm(cnpm) >>> p ...

  8. mysql 数据库保存\n 微信分享时不能换行

    主要因为保存的是\n 但是查询出来是\\n 所以需要把\\n替换为\n即可(不转换的话不会换行并且显示\n)

  9. sm4 加解密示例

    int do_crypt(char *outfile) { unsigned ]; int outlen, tmplen; /* Bogus key and IV: we'd normally set ...

  10. idea发布web项目在tomcat位置问题

    (1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布. (2)war exploded模式是直接把文件夹.jsp页面 .classes等等移到Tomcat 部署文件夹里面 ...