Oracle--jdbc调用存储过程_函数_游标

1.首先建立名为pro_query_dept的存储过程

CREATE OR REPLACE PROCEDURE pro_query_dept (  
   p_deptno   IN       dept.deptno%TYPE,  
   p_dname    OUT      dept.dname%TYPE  
)  
--声明区  
AS  
--执行区  
BEGIN  
   SELECT dname  
     INTO p_dname  
     FROM dept  
    WHERE deptno = p_deptno;  
  
   IF p_dname = 'SALES'  
   THEN  
      p_dname := '销售部门';  
   ELSE  
      p_dname := '未知部门';  
   END IF;  
  
   DBMS_OUTPUT.put_line (p_dname);  
--异常处理  
EXCEPTION  
   WHEN OTHERS  
   THEN  
      DBMS_OUTPUT.put_line (SQLCODE || SQLERRM);  
END;  

 测试存储过程:
Sql代码--测试  
  
DECLARE  
   v_dname   dept.dname%TYPE;  
BEGIN  
   pro_query_dept (30, v_dname);  
END;  


 

java类源代码:

package com.sun.myjdbc;  
  
import java.sql.CallableStatement;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.Types;  
  
public class TestC {  
      
    public static void test1(){  
        try {  
            // 加载驱动  
            Class.forName("oracle.jdbc.driver.OracleDriver");  
            String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";  
            String user = "scott";  
            String password = "tiger";  
            Connection conn = DriverManager.getConnection(url, user, password);  
            String sql = "{call pro_query_dept(?,?)}";  
            // 创建一个过程的分析容器  
            CallableStatement cst = conn.prepareCall(sql);  
            // 设置输入参数  
            cst.setInt(1, 30);  
            // 定义输出类型  
            cst.registerOutParameter(2, Types.VARCHAR);  
            // 执行存储过程  
            cst.execute();  
            // 提取存储过程输出  
            String value = cst.getString(2);  
            System.out.println(value);  
            cst.close();  
            conn.close();  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }   
    }  
      
    public static void main(String[] args) {  
        test1();  
    }  
  
}  


 

 

2.调用函数

建立名为func_query_dept的函数

CREATE OR REPLACE FUNCTION func_query_dept (  
   p_dname    OUT      dept.dname%TYPE,  
   p_deptno   IN       dept.deptno%TYPE  
)  
   RETURN VARCHAR2  
--声明区  
AS  
--执行区  
BEGIN  
   SELECT dname  
     INTO p_dname  
     FROM dept  
    WHERE deptno = p_deptno;  
  
   IF p_dname = 'SALES'  
   THEN  
      p_dname := '销售部门';  
   ELSE  
      p_dname := '未知部门';  
   END IF;  
  
   RETURN 'OK';  
--异常处理  
EXCEPTION  
   WHEN OTHERS  
   THEN  
      DBMS_OUTPUT.put_line (SQLCODE || SQLERRM);  
      RETURN 'ERROR';  
END;  


 

测试代码:

DECLARE  
   v_dname   dept.dname%TYPE;  
   v_result  varchar2(20);  
BEGIN  
   v_result := func_query_dept (v_dname, 30);  
   dbms_output.put_line(v_result);  
END;  


 java类调用函数

public void test2(){  
    try{  
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";  
        String user = "scott";  
        String password = "tiger";  
              
        Connection con = DriverManager.getConnection(url, user, password);  
        String sql = "{?= call FUNC_QUERY_DEPT(?,?)}";  
        CallableStatement cst = con.prepareCall(sql);  
        cst.registerOutParameter(1,Types.VARCHAR);  
        cst.registerOutParameter(2,Types.VARCHAR);  
        cst.setInt(3, 30);  
              
        cst.execute();  
              
        System.out.println(cst.getString(1));  
        System.out.println(cst.getString(2));  
          
        con.close();  
    }catch(Exception e){  
        e.printStackTrace();  
    }  
}  


 

3.测试游标

首先建立一个包:

CREATE OR REPLACE PACKAGE pack_dept  
IS  
   TYPE cur IS REF CURSOR;  
END;  


 

然后有两种方式返回一个游标

方式一:

CREATE OR REPLACE PROCEDURE pro_find_dept (my_cur OUT pack_dept.cur)  
IS  
BEGIN  
   OPEN my_cur FOR SELECT * FROM dept;  
END;  


 

方式二:

CREATE OR REPLACE PROCEDURE pro_find_dept (my_cur OUT sys_refcursor)  
IS  
BEGIN  
   OPEN my_cur FOR SELECT * FROM dept;  
END;  

 

最后我们的java调用类

public void test3(){  
    try{  
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";  
        String user = "scott";  
        String password = "tiger";  
        Connection con = DriverManager.getConnection(url, user, password);  
        String sql = "{call pro_find_dept(?)}";  
        CallableStatement cst = con.prepareCall(sql);  
        cst.registerOutParameter(1, OracleTypes.CURSOR);  
        cst.execute();  
          
        //如何拿到输出的值  
          
        ResultSet rs = (ResultSet)cst.getObject(1);  
        while(rs.next()){  
            System.out.println(rs.getString(2));  
        }  
          
        rs.close();  
        cst.close();  
        con.close();  
    }catch(Exception e){  
        e.printStackTrace();  
    }  
      
      
}

 开发者博客www.developsearch.com

猜你喜欢

转载自keepwork.iteye.com/blog/1944792
今日推荐