java代码调用oracle存储过程
一、简介
与调用mysql存储过程类型过程都是如下
1、创建连接 Connection conn = DriverManager.getConnection(url, user, password);
2、创建CallableStatement CallableStatement statement = conn.prepareCall(sql);
3、设置参数
statement.setInt(1, id);
statement.registerOutParameter(2, Types.VARCHAR);
statement.registerOutParameter(3, Types.INTEGER);
statement.registerOutParameter(4, Types.VARCHAR);
4、执行
statement.execute(); 或 statement.executeUpdate();
5、获取返回
int age = statement.getInt(3);
只是oracle存储过程有的结果集是以游标的方式返回,此时我们需要调用ResultSet rs = (ResultSet) statement.getObject(1);方法回去结果集
二、代码
以下存储过程表结构如下:
DROP TABLE person ;
CREATE TABLE person (
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
)
1、查询所有记录
存储过程代码如下:
create or replace procedure pro_person_findall(
p_cursor out pkg_const.r_cursor
)
is
begin
open p_cursor for
select * from person;
exception
when others then
DBMS_OUTPUT.PUT_LINE('获取信息发生错误');
end pro_person_findall;
调用代码如下
public static void findAll() {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:wuxx";
String user = "wuxx";
String password = "wuxx";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call pro_person_findall2(?)}";
CallableStatement statement = conn.prepareCall(sql);
statement.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
statement.execute();
ResultSet rs = (ResultSet) statement.getObject(1);
ResultSetMetaData rmd = rs.getMetaData();
System.out.print(rmd.getColumnName(1) + " ");
System.out.print(rmd.getColumnName(2) + " ");
System.out.print(rmd.getColumnName(3) + " ");
System.out.print(rmd.getColumnName(4) + "\n");
while (rs.next()) {
System.out.print(rs.getInt("id") + " ");
System.out.print(rs.getString("username") + " ");
System.out.print(rs.getInt("age") + " ");
System.out.print(rs.getString("password") + " \n");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
2、查询一条记录
存储过程如下
CREATE OR REPLACE PROCEDURE PRO_PERSON_FINDBYID(
v_id IN NUMBER,
v_username OUT VARCHAR2,
v_age OUT NUMBER,
v_password OUT VARCHAR2,
p_count out number
)
AS
BEGIN
SELECT username, age, password INTO v_username, v_age, v_password from person where id = v_id;
p_count := 1;
exception
when others then
p_count := 0;
END;
调用代码如下:
public static void find(Integer id) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:wuxx";
String user = "wuxx";
String password = "wuxx";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call PRO_PERSON_FINDBYID(?,?,?,?,?)}";
CallableStatement statement = conn.prepareCall(sql);
BigDecimal rid = new BigDecimal(id);
statement.setInt(1, id);
statement.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
statement.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
; //
statement.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
statement.registerOutParameter(5, oracle.jdbc.OracleTypes.NUMBER);
statement.execute();
int flag = statement.getInt(5);
if (flag != 0)
System.out.println(statement.getString(2) + " "
+ statement.getInt(3) + " " + statement.getString(4));
else
System.out.println("data not found!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
3、增加记录
存储过程代码如下:
create or replace procedure pro_person_insert(
p_id number,
p_username varchar2,
p_age number,
p_password varchar2,
p_count out number
)
is
begin
insert into person (id, username, age, password) values(p_id, p_username, p_age, p_password);
p_count := SQL%ROWCOUNT; -- SQL%ROWCOUNT为 隐士游标的属性
commit;
exception
when others then
p_count := 0;
end pro_person_insert;
调用代码如下:
public static void add(Integer id, String username, int age,
String u_password) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:wuxx";
String user = "wuxx";
String password = "wuxx";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call pro_person_insert(?,?,?,?,?)}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.setString(2, username);
statement.setInt(3, id);
statement.setString(4, u_password);
statement.registerOutParameter(5, oracle.jdbc.OracleTypes.NUMBER);// 增加记录是否成功的标记,1 成功,0失败
statement.execute();
System.out.println(statement.getInt(5));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
4、更新记录
存储过程代码如下:
create or replace procedure pro_person_update(
p_id number,
p_age number,
p_password varchar2,
p_count out number
)
is
begin
update person set age = p_age, password = p_password where id = p_id;
p_count := SQL%ROWCOUNT;
commit;
exception
when no_data_found then
p_count := 0;
when others then
p_count := -1;
end pro_person_update;
调用代码如下:
public static void update(Integer id, int age, String u_password) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:wuxx";
String user = "wuxx";
String password = "wuxx";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call pro_person_update(?,?,?,?)}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.setInt(2, age);
statement.setString(3, u_password);
statement.registerOutParameter(4, oracle.jdbc.OracleTypes.NUMBER);// 增加记录是否成功的标记
statement.execute();
System.out.println(statement.getInt(4));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
5、删除记录
存储过程代码如下:
create or replace procedure pro_person_delete(
p_id number,
p_count out number
)
is
begin
delete from person where id = p_id;
p_count := SQL%ROWCOUNT;
commit;
exception
when no_data_found then
p_count := 0;
when others then
p_count := -1;
end pro_person_delete;
调用代码如下:
public static void delete(Integer id) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:wuxx";
String user = "wuxx";
String password = "wuxx";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call pro_person_delete(?,?)}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.registerOutParameter(2, oracle.jdbc.OracleTypes.NUMBER);// 增加记录是否成功的标记
statement.execute();
System.out.println(statement.getInt(2));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
java代码调用oracle存储过程的更多相关文章
- Java代码调用Oracle的存储过程,存储函数和包
Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名 月薪 职位 create or ...
- java代码调用数据库存储过程
由于前边有写java代码调用数据库,感觉应该把java调用存储过程也写一下,所以笔者补充该篇! package testSpring; import java.sql.CallableStatemen ...
- java基础---->java调用oracle存储过程(转)
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...
- Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- java基础---->java调用oracle存储过程
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...
- 用java 调用oracle存储过程总结
SSM-Mybatis调用Oracle存储过程返回结果集(游标)示例 https://www.jianshu.com/p/0ae6d9d66d61 用java调用oracle存储过程总结 //1.ca ...
- MyBatis调用Oracle存储过程
MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...
- java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 < java 实现往oracle存储过程中传递array数组类型的参数 >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...
随机推荐
- Android、iOS和Windows Phone中的推送技术
推送并不是什么新技术,这种技术在互联网时代就已经很流行了.只是随着进入移动互联网时代,推送技术显得更加重要.因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示 ...
- [Bootstrap]7天深入Bootstrap(5)JavaScript插件
在bs3.X中,提供了12种JavaScript插件,分别是:动画过渡(Transition).模态弹窗(Modal).下拉菜单(Dropdown).滚动侦测(Scrollspy).选项卡(Tab). ...
- timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP
timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1. CURRENT_TIMESTAMP 当要 ...
- Mybatis 中在传参时,${} 和#{} 的区别
介绍 MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型. 在SQL中引用这些参数 ...
- 周末web前端练习
在 CSS 样式定义中,以下哪种 RGB 颜色值是 Web 安全色? A]#111111B]#222222C]#333333D]#444444 答案:http://hovertree.com/ti ...
- MySQL数据库 安装图解
下面的是MySQL安装的图解,用的可执行文件:下载地址:http://www.jinhusns.com/Products/Download/?type=xcj相关下载 mysql安装向导启动,按“Ne ...
- 【Bootstrap基础学习】01 Bootstrap的CSS
Bootstrap 使用了一些 HTML5 元素和 CSS 属性,所以需要使用 HTML5 文档类型. <!DOCTYPE html> <html lang="zh-CN& ...
- 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片
[源码下载] 与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片 作者:webabcd 介绍与众不同 windows pho ...
- csharp: Data binding in WPF DataGrid control
<Window x:Class="WpfProjectDemo.MainWindow" xmlns="http://schemas.microsoft.com/wi ...
- 微信公共平台开发5 .net
每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...