`
keepwork
  • 浏览: 325347 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    groovy将JDBC中oracle存储过程游标转换为多层json

    本例是我工作中的一些实操例子,亦是我工作日志,记录在此,既可作为我自己的总结,也可以此分享给同行借鉴。 入参是字符串格式的xml,目的...3.JDBC调用存储过程语句 4.创建Groovy脚本 5.xml入参示例 6.json出参示例

    详解Hibernate呼叫Oracle的存贮过程和函数

    本示例演示Hibernate 3.2呼叫Oracle的存贮过程和函数,以及通过Hibernate的Query接口简化JDBC的开发步骤--两个步骤得到List集合。使用这种方式开发可以要求开发人员不需要太了解Hibernate框架,但是需要开发人员非常...

    PL/SQL 基础.doc

    3) 扩展过程与函数; 4) 扩展对象类型与方法 ---- 第二章 PL/SQL程序结构 ---- 1. PL/SQL块 1) 申明部分, DECLARE (如果语句不需要声明任何变量,可以不写); 2) 执行部分, BEGIN <---------> END; 3) 异常...

    jdbc基础和参考

    CallableStatement:主要用来执行pl/sql的一些过程,函数等。 1.写一条恒成立的select语句,无论你输入的条件是什么,总是能讲表中的所有数据输出 select id,last_name from s_emp where '1' ='1'; where 1=1; ...

    Java面试宝典2020修订版V1.0.1.doc

    19、用JDBC如何调用存储过程 69 20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 ...

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

    java基础题 很全面

    2. 存储过程和函数的区别。 23 3. 事务是什么? 23 4. 游标的作用?如何知道游标已经到了最后? 23 5. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别? 23 简答题 23 1. 作用域public...

    javaSE代码实例

    3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全形式 43 4.1.3 语句的嵌套 43 4.2 switch多分支语句 45 4.2.1 ...

Global site tag (gtag.js) - Google Analytics