使用JDBC CallableStatements执行存储过程
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执行存储过程的更多相关文章
- JAVA使用JDBC技术操作SqlServer数据库执行存储过程
Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带 ...
- JDBC连接执行MySQL存储过程报权限错误
今天在测试项目的时候 突然就报了一个错出来. User does not have access to metadata required to determine stored procedure ...
- 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 (不写邀请码,没有现金送) 国 ...
- 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 ...
- Jdbc执行存储过程报数据库事务无法执行的异常
Jdbc执行存储过程报数据库事务无法执行的异常 环境: Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012 问题: 一个小 ...
- 原生jdbc执行存储过程
//定时任务,结转 . //表名 fys_sch_lvyou2 ,存储过程名:fys_sch_lvyou2_carrayover //无参调用:{call insertLine} //有参调用:{ca ...
- JDBC执行存储过程的四种情况 (转)
本文主要是总结 如何实现 JDBC调用Oracle的存储过程,从以下情况分别介绍: [1].只有输入IN参数,没有输出OUT参数 [2].既有输入IN参数,也有输出OUT参数,输出是简单值(非列表) ...
- JDBC使用MySQL存储过程错误
JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedur ...
- Java JDBC下执行SQL的不同方式、参数化预编译防御
相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...
随机推荐
- [Algo] 132. Deep Copy Undirected Graph
Make a deep copy of an undirected graph, there could be cycles in the original graph. Assumptions Th ...
- 初学C#之运算符和关系表达式
㈠运算符和关系表达式 一元运算符++.-- 前加和后加区别,事例++在后如下: ; ; //结果age=19 说明age++在表达式中age的值也+1.结果sum=8,原因age++,++在后用age ...
- 专业程序设计part2
05tue 乘以1.0使得int*int!=0 today:缩放 和计算机图形学关联 已知:currentdataset ask for:两个方向的缩放比例.保存路径.重采样方法(necessary) ...
- 数据分析-Matplotlib:绘图和可视化
学习路线 简介 简单绘制线形图 plot函数 支持图类型 保存图表 1.简介 Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分析的最重要的工作之一,可以帮 ...
- ios swift 判断uiviewcontroller时push present 进来的 还是pop进来的
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //显示navbar self.navi ...
- nodejs服务后台持续运行三种方法
一.利用 forever forever是一个nodejs守护进程,完全由命令行操控.forever会监控nodejs服务,并在服务挂掉后进行重启. 1.安装 forever npm install ...
- js字符串相关要点
不要创建string对象,它会拖慢执行速度,并可能产生其他副作用. var x = "John"; var y = new String("John"); (x ...
- mongodb 批量改变某一列类型 比如 String改为double,insert into select 批量插入 批量修改
//type:2代表String 1.String变Double db.集合.find({"列":{$type:2}}).forEach(function(x){ x.列=pars ...
- 关于vue内只要html元素的代码
使用v-model v-text v-html vue会解析出入的html代码报错 则上传sku的description时需要html页面的代码 所以在description 所在的表单元素内加入 v ...
- 深度学习数据集MNIST ImageNet COCO PASCAL VOC介绍
参考文档 深度学习数据集汇总介绍 1. MNIST 深度学习领域的“Hello World!”,入门必备!MNIST是一个手写数字数据库,它有60000个训练样本集和10000个测试样本集,每个样本 ...