mangguobang
2018-01-15 15:40:52
java操作Oracle存储过程示例
最近想了解一下Oracle的存储过程,于是便在网上查找各种例子,终于弄明白了,在这里也把经验分享一下,望各位指教!
创建一张用于存储过程的表:
CREATE TABLE T_TEST( I_ID VARCHAR2(20), I_NAME VARCHAR2(20) )
一、无返回参数存储过程示例
1.创建无返回参数的存储过程
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN INSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2); END TESTA;
2.编写java调用代码
package com.sxt.servlet.upload; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /** * oracle 调用存储过程 * * @author Mr.hu * @date 2018/01/15 下午14:23:25 * */ public class Test1 { public static void main(String[] args) throws Exception { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL"; String username = "PERSONNEL_MANAGE"; String password = "root"; Statement stmt = null; ResultSet rs = null; Connection conn = null; CallableStatement cstmt = null; CallableStatement proc = null; // 创建执行存储过程的对象 try { // 加载驱动 Class.forName(driver); // 获取连接 conn = DriverManager.getConnection(strUrl, username, password); proc = conn.prepareCall("{ call "+username+".TESTA(?,?) }"); // 设置存储过程// call为关键字. // 设置输入参数 proc.setString(1, "101"); // 设置第一个输入参数 proc.setString(2, "testOne"); proc.execute();// 执行 System.out.println("完成-----"); } catch (Exception e) { e.printStackTrace(); }finally{ if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } } } }
二、有返回参数的存储过程(非列表)
1.创建有返回参数的存储过程
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS BEGIN SELECT I_NAME INTO PARA2 FROM T_TEST WHERE I_ID= PARA1; END TESTB;
2.编写java调用代码
package com.sxt.servlet.upload; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Types; /** * oracle 调用存储过程 * * @author Mr.hu * @date 2018/01/15 下午14:23:25 * */ public class Test2 { public static void main(String[] args) throws Exception { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL"; String username = "PERSONNEL_MANAGE"; String password = "root"; Statement stmt = null; ResultSet rs = null; Connection conn = null; CallableStatement cstmt = null; CallableStatement proc = null; // 创建执行存储过程的对象 try { // 加载驱动 Class.forName(driver); // 获取连接 conn = DriverManager.getConnection(strUrl, username, password); proc = conn.prepareCall("{ call "+username+".TESTB(?,?) }"); // 设置存储过程// call为关键字. // 设置输入参数 proc.setString(1, "100"); // 设置第一个输入参数 proc.registerOutParameter(2,Types.VARCHAR); proc.execute();// 执行 String testPrint = proc.getString(2); System.out.println("=testPrint=is="+testPrint); System.out.println("完成-----"); } catch (Exception e) { e.printStackTrace(); }finally{ if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } } } }
三、有返回值得存储过程(列表)
1.创建存储过程
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
在SQL*PLUS中建一个程序包:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS TYPE Test_CURSOR IS REF CURSOR; end TESTPACKAGE;
创建带反回值列表的存储过程:
create or replace procedure TESTC(cur_ref out TESTPACKAGE.Test_CURSOR) is begin OPEN cur_ref FOR SELECT * FROM T_TEST; end TESTC;
2.java调用存储过程示例
package com.sxt.servlet.upload; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import oracle.jdbc.OracleTypes; /** * oracle 调用存储过程 * * @author Mr.hu * @date 2018/01/15 下午14:23:25 * */ public class Test3 { public static void main(String[] args) throws Exception { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL"; String username = "PERSONNEL_MANAGE"; String password = "root"; Statement stmt = null; ResultSet rs = null; Connection conn = null; CallableStatement proc = null; // 创建执行存储过程的对象 try { // 加载驱动 Class.forName(driver); // 获取连接 conn = DriverManager.getConnection(strUrl, username, password); proc = conn.prepareCall("{ call "+username+".TESTC(?) }"); // 设置存储过程// call为关键字. // 设置输入参数 proc.registerOutParameter(1,OracleTypes.CURSOR); // 设置第一个输入参数 proc.execute();// 执行 rs = (ResultSet) proc.getObject(1); while (rs.next()) { System.out.println("T_ID:"+rs.getString(1)); System.out.println("T_NAME:"+rs.getString(2)); } } catch (Exception e) { e.printStackTrace(); }finally{ if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } } } }
3.输出为:
T_ID:100 T_NAME:testOne1 T_ID:101 T_NAME:testOne2
至此:存储过程的简单应用也就结束了,我自己在写一便的时候也是豁然开朗,大家有什么问题可以评论,相互探讨!
评论