zoukankan      html  css  js  c++  java
  • 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     }  
  • 相关阅读:
    javaee
    前后台页面跳转及参数传递
    easyu几个常见问题
    利用easyUI填充表格数据
    easyUI数据转换为不同级别的数据
    Java数据结构漫谈-Vector
    RxJava漫谈-RxAndroid使用
    Java数据结构漫谈-Stack
    Java性能漫谈-数组复制之System.arraycopy
    Java数据结构漫谈-LinkedList
  • 原文地址:https://www.cnblogs.com/kuangwong/p/6263974.html
Copyright © 2011-2022 走看看