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