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
相关推荐
本例是我工作中的一些实操例子,亦是我工作日志,记录在此,既可作为我自己的总结,也可以此分享给同行借鉴。 入参是字符串格式的xml,目的...3.JDBC调用存储过程语句 4.创建Groovy脚本 5.xml入参示例 6.json出参示例
本示例演示Hibernate 3.2呼叫Oracle的存贮过程和函数,以及通过Hibernate的Query接口简化JDBC的开发步骤--两个步骤得到List集合。使用这种方式开发可以要求开发人员不需要太了解Hibernate框架,但是需要开发人员非常...
3) 扩展过程与函数; 4) 扩展对象类型与方法 ---- 第二章 PL/SQL程序结构 ---- 1. PL/SQL块 1) 申明部分, DECLARE (如果语句不需要声明任何变量,可以不写); 2) 执行部分, BEGIN <---------> END; 3) 异常...
CallableStatement:主要用来执行pl/sql的一些过程,函数等。 1.写一条恒成立的select语句,无论你输入的条件是什么,总是能讲表中的所有数据输出 select id,last_name from s_emp where '1' ='1'; where 1=1; ...
19、用JDBC如何调用存储过程 69 20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 ...
给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...
2. 存储过程和函数的区别。 23 3. 事务是什么? 23 4. 游标的作用?如何知道游标已经到了最后? 23 5. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别? 23 简答题 23 1. 作用域public...
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 ...