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 }