java下实现调用oracle的存储过程和函数

Oracle下创建一个test的账户,然后

1.创建表:STOCK_PRICES

1 --创建表格  
2 CREATE TABLE STOCK_PRICES(  
3     RIC VARCHAR(6) PRIMARY KEY,  
4     PRICE NUMBER(7,2),  
5     UPDATED DATE ); 

2.插入测试数据:

1     --插入数据  
2     INSERT INTO stock_prices values('1111',1.0,SYSDATE);  
3     INSERT INTO stock_prices values('1112',2.0,SYSDATE);  
4     INSERT INTO stock_prices values('1113',3.0,SYSDATE);  
5     INSERT INTO stock_prices values('1114',4.0,SYSDATE);  

3.建立一个返回游标:

PKG_PUB_UTILS

1     --建立一个返回游标  
2     CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS  
3         --动态游标  
4         TYPE REFCURSOR IS REF CURSOR;  
5     END PKG_PUB_UTILS;  

4.创建和存储过程:P_GET_PRICE

 1     --创建存储过程  
 2     CREATE OR REPLACE PROCEDURE P_GET_PRICE  
 3     (  
 4       AN_O_RET_CODE OUT NUMBER,  
 5       AC_O_RET_MSG  OUT VARCHAR2,  
 6       CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,  
 7       AN_I_PRICE IN NUMBER  
 8     )   
 9     IS  
10     BEGIN  
11         AN_O_RET_CODE := 0;  
12         AC_O_RET_MSG  := '操作成功';  
13           
14         OPEN CUR_RET FOR  
15             SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;  
16     EXCEPTION  
17         WHEN OTHERS THEN  
18             AN_O_RET_CODE := -1;  
19             AC_O_RET_MSG  := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;  
20     END P_GET_PRICE;  

5.创建函数:

 1 --创建函数:F_GET_PRICE  
 2 CREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER)  
 3     RETURN PKG_PUB_UTILS.REFCURSOR  
 4 AS  
 5     stock_cursor PKG_PUB_UTILS.REFCURSOR;  
 6 BEGIN  
 7     OPEN stock_cursor FOR  
 8     SELECT * FROM stock_prices WHERE price < v_price;  
 9     RETURN stock_cursor;  
10 END; 

6.JAVA调用存储过程返回结果集

JDBCoracle10G_INVOKEPROCEDURE.Java

 1 import java.sql.*;  
 2 import oracle.jdbc.OracleCallableStatement;  
 3 import oracle.jdbc.OracleTypes;  
 4   
 5 /* 本例是通过调用oracle的存储过程来返回结果集: 
 6  * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip 
 7  */  
 8 public class JDBCoracle10G_INVOKEPROCEDURE {  
 9     Connection conn = null;  
10     Statement statement = null;  
11     ResultSet rs = null;  
12     CallableStatement stmt = null;  
13   
14     String driver;  
15     String url;  
16     String user;  
17     String pwd;  
18     String sql;  
19     String in_price;  
20   
21     public JDBCoracle10G_INVOKEPROCEDURE()   
22     {  
23         driver = "oracle.jdbc.driver.OracleDriver";  
24         url = "jdbc:oracle:thin:@localhost:1521:ORCL";  
25         // oracle 用户  
26         user = "test";  
27         // oracle 密码  
28         pwd = "test";  
29         init();  
30         // mysid:必须为要连接机器的sid名称,否则会包以下错:  
31         // java.sql.SQLException: Io 异常: Connection  
32         // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))  
33         // 参考连接方式:  
34         // Class.forName( "oracle.jdbc.driver.OracleDriver" );  
35         // cn = DriverManager.getConnection(  
36         // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );  
37   
38     }  
39   
40     public void init() {  
41         System.out.println("oracle jdbc test");  
42         try {  
43             Class.forName(driver);  
44             System.out.println("driver is ok");  
45             conn = DriverManager.getConnection(url, user, pwd);  
46             System.out.println("conection is ok");  
47             statement = conn.createStatement();  
48             // conn.setAutoCommit(false);  
49             // 输入参数  
50             in_price = "3.0";  
51             // 调用函数  
52             stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");  
53             stmt.registerOutParameter(1, java.sql.Types.FLOAT);  
54             stmt.registerOutParameter(2, java.sql.Types.CHAR);  
55             stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);  
56             stmt.setString(4, in_price);  
57             stmt.executeUpdate();  
58             int retCode = stmt.getInt(1);  
59             String retMsg = stmt.getString(2);  
60             if (retCode == -1) { // 如果出错时,返回错误信息  
61                 System.out.println("报错!");  
62             } else {  
63                 // 取的结果集的方式一:  
64                 rs = ((OracleCallableStatement) stmt).getCursor(3);  
65                 // 取的结果集的方式二:  
66                 // rs = (ResultSet) stmt.getObject(3);  
67                 String ric;  
68                 String price;  
69                 String updated;  
70                 // 对结果进行输出  
71                 while (rs.next()) {  
72                     ric = rs.getString(1);  
73                     price = rs.getString(2);  
74                     updated = rs.getString(3);  
75                     System.out.println("ric:" + ric + ";-- price:" + price  
76                             + "; --" + updated + "; ");  
77                 }  
78             }  
79   
80         } catch (Exception e) {  
81             e.printStackTrace();  
82         } finally {  
83             System.out.println("close ");  
84         }  
85     }  
86   
87     public static void main(String args[])// 自己替换[]  
88     {  
89         new JDBCoracle10G_INVOKEPROCEDURE();  
90     }  
91 } 

7.开发JAVA调用函数返回结果集

JDBCoracle10G_INVOKEFUNCTION.java

 1     import java.sql.*;  
 2     import oracle.jdbc.OracleCallableStatement;  
 3     import oracle.jdbc.OracleTypes;  
 4       
 5     /* 
 6      /* 本例是通过调用oracle的函数来返回结果集: 
 7      * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip   
 8      */  
 9     public class JDBCoracle10G_INVOKEFUNCTION {  
10         Connection conn = null;  
11         Statement statement = null;  
12         ResultSet rs = null;  
13         CallableStatement stmt = null;  
14       
15         String driver;  
16         String url;  
17         String user;  
18         String pwd;  
19         String sql;  
20         String in_price;  
21       
22         public JDBCoracle10G_INVOKEFUNCTION()  
23         {  
24             driver = "oracle.jdbc.driver.OracleDriver";  
25             url = "jdbc:oracle:thin:@localhost:1521:ORCL";  
26             // oracle 用户  
27             user = "test";  
28             // oracle 密码  
29             pwd = "test";  
30             init();  
31             // mysid:必须为要连接机器的sid名称,否则会包以下错:  
32             // java.sql.SQLException: Io 异常: Connection  
33             // refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))  
34             // 参考连接方式:  
35             // Class.forName( "oracle.jdbc.driver.OracleDriver" );  
36             // cn = DriverManager.getConnection(  
37             // "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );  
38         }  
39       
40         public void init() {  
41             System.out.println("oracle jdbc test");  
42             try {  
43                 Class.forName(driver);  
44                 System.out.println("driver is ok");  
45                 conn = DriverManager.getConnection(url, user, pwd);  
46                 System.out.println("conection is ok");  
47                 statement = conn.createStatement();  
48                 // conn.setAutoCommit(false);  
49                 // 输入参数  
50                 in_price = "5.0";  
51                 // 调用函数  
52                 stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");  
53                 // stmt.registerOutParameter(1, java.sql.Types.FLOAT);  
54                 // stmt.registerOutParameter(2, java.sql.Types.CHAR);  
55                 stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);  
56                 stmt.setString(2, in_price);  
57                 stmt.executeUpdate();  
58                 // 取的结果集的方式一:  
59                 rs = ((OracleCallableStatement) stmt).getCursor(1);  
60                 // 取的结果集的方式二:  
61                 // rs = (ResultSet) stmt.getObject(1);  
62                 String ric;  
63                 String price;  
64                 String updated;  
65       
66                 while (rs.next()) {  
67                     ric = rs.getString(1);  
68                     price = rs.getString(2);  
69                     updated = rs.getString(3);  
70                     System.out.println("ric:" + ric + ";-- price:" + price + "; --"  
71                             + updated + "; ");  
72                 }  
73       
74             } catch (Exception e) {  
75                 e.printStackTrace();  
76             } finally {  
77                 System.out.println("close ");  
78             }  
79         }  
80       
81         public static void main(String args[])// 自己替换[]  
82         {  
83             new JDBCoracle10G_INVOKEFUNCTION();  
84         }  
85     }  
原文地址:https://www.cnblogs.com/kuangwong/p/6263974.html