在 mysql命令行中:
创建不带参数的存储过程,如:
create procedure sp_name () select * from usertable; 表示创建一个名为sp_name的存储过程,执行的语句为 select * from usertable;
执行存储过程:
call sp_name();
2.通过CallableStatement接口在JAVA程序中执行存储过程:
1.Connection conn = 连接数据库 ;(conn 为连接数据库后返回的引用)
2.[例子] CallableStatement cstmt = conn.prepareCall("{call show_usertbl()}"); //创建CallableStatement对象.调用prepareCall方法调用存储过程
//例子中,存储过程的名字为 show_usertbl(),call表示调用.注意,旁边要有中括号{}引起来
(一)调用没有参数的存储过程
public class Test3 {
public static void main(String[] args) {
test();
static void test() {
Connection conn = DBUtil.open(); // 连接数据库 (注:DBUtil是自定义的类,详细定义如何可翻看之前文章)
try {
CallableStatement cstmt = conn.prepareCall("{call show_usertbl()}");// 第一步
ResultSet rs = cstmt.executeQuery(); // 第二步,执行存储过程调用,结果返回到 rs中。
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
System.out.println("id:" + id + " name:" + name);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(conn); // 关闭数据库
(二)带输入参数的存储过程:
参数类型: in 表示输入,out 表示输出
在mysql命令行下:
创建带输入参数的存储过程:
例子:create procedure insert_usertbl(in myid int, in myname varchar(20)) insert into usertbl(id,name) values(20,"xiaoming");
说明:insert_usertbl 是存储过程的名字,myid是整型的输入参数,myname是字符型的输入参数, insert into usertbl(id,name) values(20,"xiaoming") 是SQL语句
创建存储过程后,在JAVA程序中通过CallableStatement接口调用:
问号?表示要动态赋值的变量。
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
public class Test4 {
public static void main(String[] args) {
Insert();
static void Insert()
Connection conn = DBUtil.open(); //连接数据库
try {
CallableStatement cstmt = conn.prepareCall("{call insert_usertbl(?,?)}");
//问号表示要动态赋值的参数
cstmt.setInt(1, 8); //给第一个问号赋值为8
cstmt.setString(2, "xiaowang"); //给第二个问号赋值为“xiaowang”
cstmt.executeUpdate(); //执行 call insert_usertbl(8,“xiaowang”)
} catch (SQLException e) {
e.printStackTrace();
}finally
DBUtil.close(conn); //关闭数据库
(三)创建有输入输出参数的存储过程:
参数类型: in 表示输入,out 表示输出
在mysql命令行下:
例子:create procedure getNameById(in cid int,out return_name varchar(20)) select name from usertbl where id = cid;
说明:其中getNameById为存储过程名字,cid为要输入的参数,而return_name为系统要返回给我的数据。select name into return_name from usertbl where id = cid 是操作的SQL语句 (返回的name是从return_name中抽取的)
Java程序中用CallableStatement接口调用此存储过程:
注意:有输出变量的时候,要给输出变量进行注册
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
public class Test5 {
public static void main(String[] args) {
getName();
static void getName() {
Connection conn = DBUtil.open();
try {
CallableStatement cstmt = conn.prepareCall("{call getNameById(?,?)}");// 输入输出变量都要以?表示
cstmt.setInt(1, 20); // 给第一个问号赋值为20
// 注册输出参数
cstmt.registerOutParameter(2, Types.CHAR); // 给作为输出变量的第二个问号注册,并制定其为char型
cstmt.execute(); // 执行 call getNameById()
String name = cstmt.getString(2); // 取存储过程中的第二个变量的值
System.out.println("name:" + name);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(conn);
1.什么是存储过程:在数据库中,可以通过创建一个存储过程来达到一次性执行多条SQL语句的目的在 mysql命令行中:创建不带参数的存储过程,如:create procedure sp_name () select * from usertable; 表示创建一个名为sp_name的存储过程,执行的语句为 select * from usertable;
Java调用存储过程java代码调用存储过程,需要获取到connection对象,然后执行prepareCall()方法,样例如下:package com.leo.test;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Resu
int getInt(int parameterIndex) throws SQLException
float getFloat(int parameterIndex) throws SQLException
关于postgresql的多结果集,或者游标返回存储过程请查看上篇文章:
【转载】postgresql存储过程中返回类型
本篇文章主要是为了将游标cursor的返回结果实用化而作出各种猜测及调整。目的在于找到java+pg数据库存储过程的最佳开发模式及调用方式。
必要数据及代码交代
地区区域表一张,数据量大约30000条,不过不是重点,表结构如下:
"id" int4 DEFAUL...
前言:在按部就班的学习JDBC的过程中,来到了这里来——CallableStetement。怀着不情愿的心情花了一下午学习了相关知识,不情愿是因为感觉像鸡肋,学了没什么用。也许是我能力有限,目光短浅吧。总之,既学之 ,则记之。以防忘记,又要遭受那不情愿之苦而重新学一次
注:本文基于mysql数据库
一、存储过程
存储过程是为了完成特定功能的SQL语句...
1. jdbc 调用存储过程
jdbc 调用存储过程与函数, 均是通过CallableStatement 类执行sql的. 通常而已, 存储过程是不允许有返回值的, 而函数是允许有返回值的.
1.1 CallableStatement sql
jdbc调用存储过程与函数的sql写法有区别, 需要额外注意:
存储过程: { call $produceName([?,…]) }
函数: { ?= c...