美文网首页Java web数据库
Oracle PL/SQL(16) - JAVA调用Oracle

Oracle PL/SQL(16) - JAVA调用Oracle

作者: 乘风破浪的姐姐 | 来源:发表于2020-06-02 17:46 被阅读0次

    Java代码调用存储过程和函数步骤(以下以maven工程为例):
    第一步,pom.xml文件,引入jar包:ojdbc6、testng

     <dependency>
               <groupId>com.oracle</groupId>
               <artifactId>ojdbc6</artifactId>
               <version>11.2.0.3.0</version>
           </dependency>
    
           <dependency>
               <groupId>org.testng</groupId>
               <artifactId>testng</artifactId>
               <version>6.8.8</version>
           </dependency>
    

    第二步,新建JdbcUtils.class文件,创建JDBC工具类

    import java.sql.*;
    
    /**
    * JDBC工具类 ,一般工具类final。
    * 工具类一般不需要new,不需要构造实例。(把构造方法私有)别人就new不了了。
    * 此时使用类的方法:
    * 1是单例模式(复杂点)
    * 2是提供静态的public方法。(简单)
    * 本例子是简单的提供public方法实现的。需要静态方法
    */
    public final class JdbcUtils {
       private static String  url ="jdbc:oracle:thin:@**.**.**.**:1521:orcl";
       private static String user ="XXX";
       private static  String passWord = "XXX";
    
       //构造方法私有,别人不能构造,不会有实例出来.
       private JdbcUtils(){
    
       }
    
       /**
        * 静态代码块,类加载到虚拟机是只执行一次。
        */
       static {
           try {
               Class.forName("oracle.jdbc.driver.OracleDriver");
           } catch (ClassNotFoundException e) {
    
               e.printStackTrace();
           }
    
       }
    
       public static Connection getConnection() {
           Connection conn = null;
           try {
               conn =  DriverManager.getConnection(url,user,passWord);
           } catch (SQLException e) {
    
               e.printStackTrace();
           }
           return conn;
       }
    
       //释放资源,重载方法。
       public static void close(Connection conn) {
           try {
               if(conn != null){
                   conn.close();
                   conn = null;
               }
           }catch(SQLException e){
               e.printStackTrace();
           }
       }
       public static void close(Statement stmt){
           try{
               if(stmt != null){
                   stmt.close();
                   stmt = null;
               }
           }catch(SQLException e){
               e.printStackTrace();
           }
       }
       public static void close(ResultSet rs){
           try{
               if(rs != null){
                   rs.close();
                   rs = null;
               }
           }catch (SQLException e) {
               e.printStackTrace();
           }
       }
    }
    

    第三步,创建JAVA调用Oracle的存储过程和函数的测试类OracleTest.class,需要使用CallableStatement接口。

    具体操作如下。

    1.JAVA调用无返回值的存储过程
    1)创建存储过程

    create or replace procedure pro_model (modelid in varchar2,seriesid  out varchar2,modelname out varchar2)
    as
    begin
      select m.vehicle_series_id,m.vehicle_sub_model_name into seriesid,modelname
      from t_md_vehicle_model m
      where m.vehicle_sub_model_id=modelid
      and m.valid_flag=1;
    end;
    

    2)在测试类中添加以下方法

    @Test
       public void testProcedure1(){
           //格式 {call <procedure-name>[(<arg1>,<arg2>, ...)]}
           String sql = "{call pro_model(?,?,?)}";
           Connection conn = null;
           CallableStatement call = null;
    
           try {
               conn = JdbcUtils.getConnection();
               call = conn.prepareCall(sql);
               //赋值
               call.setString(1, "CN130010202");
               //对于out参数,声明
               call.registerOutParameter(2, OracleTypes.VARCHAR);
               call.registerOutParameter(3, OracleTypes.VARCHAR);
    
               //调用
               call.execute();
    
               //取值
               String id = call.getString(2);
               String name = call.getString(3);
               System.err.println(id);
               System.err.println(name);
           }catch(Exception e){
               e.printStackTrace();
           }finally{
               JdbcUtils.close(call);
               JdbcUtils.close(conn);
           }
       }
    

    3)右键执行测试,结果如下


    image.png

    2.JAVA调用有返回值的存储过程
    1)创建存储过程

    create or replace procedure
     pro_model_list (seriesid in varchar2,modelList out SYS_REFCURSOR)is
    
    begin
      open modelList for
        select m.model_id,m.model_name from t_model m
        where m.series_id=seriesid
        and m.valid_flag=1;
    end ;
    

    2)在测试类中添加以下方法

    @Test
       public void testProcedure2(){
           //格式 {call <procedure-name>[(<arg1>,<arg2>, ...)]}
           String sql = "{call pro_model_list(?,?)}";
           Connection conn = null;
           CallableStatement call = null;
           ResultSet rs = null;
           try {
               conn = JdbcUtils.getConnection();
               call = conn.prepareCall(sql);
               //赋值
               call.setString(1, "13001");
               //对于out参数,声明
               call.registerOutParameter(2, OracleTypes.CURSOR);
    
               //调用
               call.execute();
    
               rs = ((OracleCallableStatement)call).getCursor(2);
               while(rs.next()){
                   String id = rs.getString("model_id");
                   String name = rs.getString("model_name");
    
                   System.err.println("modelid:"+id+",modelname:"+name);
    
               }
           }catch(Exception e){
               e.printStackTrace();
           }finally{
               JdbcUtils.close(call);
               JdbcUtils.close(conn);
           }
       }
    

    3)右键执行测试,结果如下


    image.png

    3.JAVA调用有返回值的函数
    1)创建函数

    create or replace function  getCompareResults(para1  number, para2  number) return number
    as
     begin
       if para1 > para2 then
         return para1;
       else
           return para2;
       end if;
    end;
    

    2)在测试类中添加以下方法

    @Test
       public void testFunction(){
           //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
           //第一个?--> 输出参数,返回值,    第二个 ?-->输入参数
           String sql = "{?= call getCompareResults(?,?)}";
           Connection conn = null;
           CallableStatement call = null;
    
           try {
               conn = JdbcUtils.getConnection();
               call = conn.prepareCall(sql);
    
               //注册输出参数
               call.registerOutParameter(1, OracleTypes.NUMBER);
               //输入参数
               call.setInt(2, 7839);
               call.setInt(3, 7139);
    
               //执行
               call.execute();
               //取出结果,注意是get 1
               int result = call.getInt(1);
               System.err.println("比较大小结果为::"+result+" 大。");
    
           } catch (Exception e) {
               e.printStackTrace();
           }finally{
               JdbcUtils.close(call);
               JdbcUtils.close(conn);
           }
       }
    

    3)右键执行测试,结果如下


    image.png

    相关文章

      网友评论

        本文标题:Oracle PL/SQL(16) - JAVA调用Oracle

        本文链接:https://www.haomeiwen.com/subject/tetlnhtx.html