mangguobang的gravatar头像
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

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


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
你的小可爱666  LV1 2019年12月18日
韩毅飞  LV11 2019年4月13日
jyst_h5 2019年2月27日
暂无贡献等级
阿昌先生  LV13 2019年1月30日
zshb_gxj  LV8 2018年12月21日
逆袭 奋起  LV4 2018年10月23日
yuchenjwp  LV9 2018年9月2日
careMe 2018年8月6日
暂无贡献等级
Space  LV29 2018年6月21日
小三轮1987  LV3 2018年6月14日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友