jdbc存储过程调用

1.调用存储过程
首先建立名为pro_query_dept的存储过程
Java代码  
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类源代码:
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的函数
Java代码  
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;  
 
测试代码:
Java代码  
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类调用函数
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.测试游标
首先建立一个包:
Java代码  
CREATE OR REPLACE PACKAGE pack_dept  
IS  
   TYPE cur IS REF CURSOR;  
END;  
 
然后有两种方式返回一个游标
方式一:
Java代码  
CREATE OR REPLACE PROCEDURE pro_find_dept (my_cur OUT pack_dept.cur)  
IS  
BEGIN  
   OPEN my_cur FOR SELECT * FROM dept;  
END;  
 
方式二:
Java代码  
CREATE OR REPLACE PROCEDURE pro_find_dept (my_cur OUT sys_refcursor)  
IS  
BEGIN  
   OPEN my_cur FOR SELECT * FROM dept;  
END;  
 
最后我们的java调用类
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();  
    }  
      
      
}  
posted @ 2013-09-14 10:41  空虚公子  阅读(267)  评论(0编辑  收藏  举报