一、简介

  与调用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存储过程的更多相关文章

  1. Java代码调用Oracle的存储过程,存储函数和包

    Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名  月薪 职位 create or ...

  2. java代码调用数据库存储过程

    由于前边有写java代码调用数据库,感觉应该把java调用存储过程也写一下,所以笔者补充该篇! package testSpring; import java.sql.CallableStatemen ...

  3. java基础---->java调用oracle存储过程(转)

    存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...

  4. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  5. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  6. java基础---->java调用oracle存储过程

    存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...

  7. 用java 调用oracle存储过程总结

    SSM-Mybatis调用Oracle存储过程返回结果集(游标)示例 https://www.jianshu.com/p/0ae6d9d66d61 用java调用oracle存储过程总结 //1.ca ...

  8. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  9. java 实现往oracle存储过程中传递array数组类型的参数

    注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...

随机推荐

  1. “康园圈--互联网+校园平台“项目之sprint2

    一.sprint2任务列表 1.部署框架,并上传代码到github. 2.原型设计 * 设计首页界面原型(包括功能公告.快速通道等展示栏) * 设计店铺浏览页面原型 * 设计店内浏览页面原型 * 设计 ...

  2. 重构第25天 引入契约设计(Introduce Design By Contract checks)

    理解:本文中的”引入契约式设计”是指我们应该对应该对输入和输出进行验证,以确保系统不会出现我们所想象不到的异常和得不到我们想要的结果. 详解:契约式设计规定方法应该对输入和输出进行验证,这样你便可以保 ...

  3. WebService服务调用方法介绍

    1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 ...

  4. knockout的依赖属性dependentObservable和observable的监控的使用

    1.Knockout是在下面三个核心功能是建立起来的:监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模 ...

  5. jquery checkbox checked

    1.question: when first operate the checkbox with sentence like : $("input[type=checkbox]") ...

  6. ahjesus Unity3D界面快捷键

    F Frame selection Tab Shift focus between first column and second column (Two columns) Ctrl/Cmd + F ...

  7. bootstrap glyphicon图标无法显示

    如果不注意bootstrap引入css和fonts的规范,则可能会导致bootstrap 在显示glyphicon图标时无法正常显示,显示为方框. 此时可搜索bootstrap.css中的.glyph ...

  8. galera cluster DDL节点间状态不一致的问题

    近期某个系统中的galera cluseter环境发生A DDL操作后,B节点未同步的情况,同时B节点的errorlog中有如下警告信息: 2016-07-23 17:31:32 18920 [War ...

  9. NYOJ 1058 部分和问题

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  10. MUI - 将tap模拟成原生click体验

    mui提供了tap事件替换了html5的click事件,解决了300ms延时的问题.不过相比原生app的click体验还是有些许差距的.关于300ms延时的问题,这篇帖子分析的比较完善,其中提到了穿透 ...