java代码调用oracle存储过程

简介: 一、简介   与调用mysql存储过程类型过程都是如下   1、创建连接 Connection conn = DriverManager.getConnection(url, user, password);   2、创建CallableStatement CallableStatement statement = conn.

一、简介

  与调用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();
        }
    }

 

目录
相关文章
|
21小时前
|
Java 数据处理 开发者
Java中的Lambda表达式:简化你的代码之路
【8月更文挑战第66天】Lambda表达式在Java 8中首次引入,它为Java开发者提供了一种更简洁、更灵活的编程方式。本文将通过简单易懂的语言和实际代码示例,引导你理解Lambda表达式的基本概念、语法结构以及如何在Java项目中应用它来简化代码。无论你是Java新手还是有经验的开发者,这篇文章都将帮助你更好地掌握这一强大的工具。
28 11
|
18天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
7天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
20 5
|
9天前
|
Java API 开发者
探索Java中的Lambda表达式:简洁与强大的代码实践
本文深入探讨Java中Lambda表达式的定义、用法及优势,通过实例展示其如何简化代码、提升可读性,并强调在使用中需注意的兼容性和效率问题。Lambda作为Java 8的亮点功能,不仅优化了集合操作,还促进了函数式编程范式的应用,为开发者提供了更灵活的编码方式。
|
5天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
8天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
9天前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
24 3
|
8天前
|
存储 Java 索引
使用java代码实现左右括号查找
使用java代码实现左右括号查找
|
9天前
|
算法 Java
java 概率抽奖代码实现
java 概率抽奖代码实现
|
18天前
|
Java 程序员 API
Java中的Lambda表达式:简化代码的秘密武器
在Java 8中引入的Lambda表达式是一种强大的编程工具,它可以显著简化代码,提高可读性。本文将介绍Lambda表达式的基本概念、优势以及在实际开发中的应用。通过具体示例,您将了解如何使用Lambda表达式来简化集合操作、线程编程和函数式编程。让我们一起探索这一革命性的特性,看看它是如何改变Java编程方式的。
25 4

推荐镜像

更多
下一篇
无影云桌面