Java调用Oracle存储过程详解

Java调用Oracle存储过程详解

步骤:

1、编写Oracle存储过程

2、编写数据库获取连接工具类

3、编写简单应用调用存储过程

实现:

1、Oracle存储过程:

/*测试表*/
create table test(
  id varchar2(32),
  name varchar2(32)
);

/*存储过程 插入数据*/
CREATE OR REPLACE PROCEDURE insert_procedure(
  PARA1 IN VARCHAR2,
  PARA2 IN VARCHAR2
) AS
BEGIN
 INSERT INTO test (id, name) VALUES (PARA1, PARA2);
END insert_procedure;

/*存储过程 返回结果集*/
CREATE OR REPLACE PROCEDURE select_procedure(
  para_id IN VARCHAR2,
  name OUT sys_refcursor /* 这个sys_refcursor类型在SYS.STANDARD包中 */
) AS
BEGIN
 OPEN name FOR
  SELECT * FROM test WHERE id = para_id;
END;

2、JDBC工具类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
  public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
  public static final String URL = "jdbc:oracle:thin:@localhost:1521/orcl";
  public static final String USERNAME = "pfm";
  public static final String PASSWORD = "pfm";

  /**
   * 通过静态代码块 注册数据库驱动
   */
  static {
    try {
      Class.forName(DRIVER);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }

  /**
   * 获得Connection
   *
   * @return
   */
  public static Connection getConnection() {
    Connection conn = null;
    try {
      conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return conn;
  }

  /**
   * 获得Statement
   *
   * @return
   */
  public static Statement getStatement() {
    Statement st = null;
    try {
      st = getConnection().createStatement();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return st;
  }

  /**
   * 关闭ResultSet
   *
   * @param rs
   */
  public static void closeResultSet(ResultSet rs) {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 关闭Statement
   *
   * @param st
   */
  public static void closeStatement(Statement st) {
    if (st != null) {
      try {
        st.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 关闭Connection
   *
   * @param conn
   */
  public static void closeConnection(Connection conn) {
    if (conn != null) {
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 关闭全部
   *
   * @param rs
   * @param sta
   * @param conn
   */
  public static void closeAll(ResultSet rs, Statement sta, Connection conn) {
    closeResultSet(rs);
    closeStatement(sta);
    closeConnection(conn);
  }

}

3、调用存储过程:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.driver.OracleTypes;

/**
 * 测试调用存储过程
 *
 */
public class StoredTest {
  public static void main(String[] args) {
    insert_call();
    //select_call();
  }

  /**
   * 执行存储过程 插入数据
   */
  public static void insert_call() {
    Connection conn = DBUtil.getConnection();
    PreparedStatement pst = null;

    CallableStatement proc = null; // 创建执行存储过程的对象
    try {
      proc = conn.prepareCall("{ call insert_procedure(?,?) }");
      proc.setString(1, "1"); // 设置第一个输入参数
      proc.setString(2, "hello call"); // 设置第一个输入参数
      proc.execute();// 执行

    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        // 关闭IO流
        proc.close();
        DBUtil.closeAll(null, pst, conn);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 执行存储过程 查询数据
   */
  public static void select_call() {
    Connection conn = DBUtil.getConnection();

    CallableStatement stmt;
    try {
      stmt = conn.prepareCall("{ call select_procedure(?, ?) }"); // 用此调用方法不能实现多行语法
      stmt.setString(1, "1");
      stmt.registerOutParameter(2, OracleTypes.CURSOR);
      stmt.execute();
      ResultSet rs = (ResultSet) stmt.getObject(2);
      while (rs.next()) {
        System.out.println(rs.getString("name"));
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      DBUtil.closeConnection(conn);
    }
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • java调用Oracle存储过程的方法实例

    1.测试添加数据的procedure 复制代码 代码如下: public void testProcedure() {        Connection con = getConnction(); // **1.测试添加数据的procedure          String procedure = "{call users_insert_proc(?,?,?,?) }"; CallableStatement cs = null;        try {             c

  • java调用oracle分页存储过程示例

    1.分页类 复制代码 代码如下: package org.zh.basic; /** * 页面类 *  * @author keven *  */public class PageInfo { // 定义    private String p_tableName; // -表名    private String p_strWhere; // --查询条件    private String p_orderColumn; // --排序的列    private String p_orderS

  • Java下使用Oracle存储过程(详解)第1/3页

    任何转载,请尊重版权.(作者:iihero on csdn) 一.如何创建java存储过程? 通常有三种方法来创建java存储过程. 1. 使用oracle的sql语句来创建: e.g. 使用create or replace and compile java source named "<name>" as 后边跟上java源程序.要求类的方法必须是public static的,才能用于存储过程. 复制代码 代码如下: SQL> create or replace

  • Java调用Oracle存储过程详解

    Java调用Oracle存储过程详解 步骤: 1.编写Oracle存储过程 2.编写数据库获取连接工具类 3.编写简单应用调用存储过程 实现: 1.Oracle存储过程: /*测试表*/ create table test( id varchar2(32), name varchar2(32) ); /*存储过程 插入数据*/ CREATE OR REPLACE PROCEDURE insert_procedure( PARA1 IN VARCHAR2, PARA2 IN VARCHAR2 )

  • java调用回调机制详解

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b(), 一直等待b()方法执行完毕, a()方法继续往下走. 这种调用方式适用于方法b()执行时间不长的情况, 因为b()方法执行时间一长或者直接阻塞的话, a()方法的余下代码是无法执行下去的, 这样会造成整个流程的阻塞. 2.异步调用 异步调用是为了解决同步调用可能出现阻塞, 导致整个流程卡住而产

  • Java实现调用MySQL存储过程详解

    前言 存储过程(Stored Procedure)是存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. Java调用MySQL的存储过程,需要用JDBC连接,环境eclipse 首先查看MySQL中的数据库的存储过程,接着编写代码调用 mysql> show procedure status; +------+-------------+-----------+----------------+-------------

  • Java 调用天气Webservice详解及实例代码

    Java调用天气Webservice的小应用 废话不多说,直接贴代码: CityReq.java package com.weather; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="getWeatherbyCityName",namespace="http://WebXml.com.cn/

  • Java调用外接设备详解(制卡机)

    最近在开发的系统中,有一个接入外接设备制卡机更换,之前用的制卡机要重新采购,所以导致之前的调用接口方法无效,要用新的设备接口来进行调用.可是这个设备是外国进口过来的,资料很少.想要百度的话,网上资料都没有,中间经过了几天的摸索,最终还是弄了出来,所以把详细的分析及解决方法记录下来. 这个制卡机是打印磁卡/智能卡的,像我们常用的银行卡.饭卡.购物卡都可以用这个机器来进行设计并制卡,并最终发放给消费者使用.简要说下解决的思路吧,最开始拿到这个机器的时候,我是一头的雾水,也不知道从何下手,我当时最最简

  • Mybatis调用Oracle存储过程的方法图文详解

    1:调用无参数的存储过程. 创建存储过程: Mapper.xml 配置:经测试其他标签(update.insert.select)也可以. Mapper.java MapperTest.java 测试 2:有参数的存储过程调用: 2.1存储过程的创建: 2.2Mapper.xml 的配置: 2.3Mapper.java 2.4MapperTest.java 测试 控制台输出: 3:存储过程的结果集调用. 3.1创建存储过程: 3.2 Mapper.xml 配置 配置 resultMap结果集字段

  • Oracle中instr和substr存储过程详解

    instr和substr存储过程,分析内部大对象的内容 instr函数 instr函数用于从指定的位置开始,从大型对象中查找第N个与模式匹配的字符串. 用于查找内部大对象中的字符串的instr函数语法如下: dbms_lob.instr( lob_loc in blob, pattern in raw, offset in integer := 1; nth in integer := 1) return integer; dbms_lob.instr( lob_loc in clob char

  • java中构造器内部调用构造器实例详解

    可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点. public class Flower { private String string; private int age; public Flower() { // 先调用public Flower(String string, int age) this("leon", 120); // 先调用public Flower(String string, int

随机推荐