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

 
 

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

1.创建表:STOCK_PRICES

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

2.插入测试数据:

[sql] view plaincopy
 
  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

[cpp] view plaincopy
 
  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

[sql] view plaincopy
 
  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.创建函数:

[cpp] view plaincopy
 
  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

[java] view plaincopy
 
  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

[java] view plaincopy
 
  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. }