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

至此:存储过程的简单应用也就结束了,我自己在写一便的时候也是豁然开朗,大家有什么问题可以评论,相互探讨!




猜你喜欢

转载自blog.csdn.net/huxiangen/article/details/79064150