via: http://slbszq.iteye.com/blog/2008076
Java调用Oracle中有返回值的存储过程
1) 在编写存储过程时,输入参数用in(如果不写默认为in),输出参数用out
-- 编写过程,要求输入雇员编号,返回雇员姓名。
create or replace procedure getNameByNo(no in number, name out varchar2) is
begin
select ename into name from emp where empno = no;
end;
-- 输入部门号,返回该部门所有员工
-- 先建一个包,定义一个游标类型
create or replace package pkg_cursor is
type my_cursor_type is ref cursor;
end pkg_cursor;
-- 创建过程
create or replace procedure getByDeptno(depno in number, emp_cursor out pkg_cursor.my_cursor_type) is
begin
open emp_cursor for
select * from emp where deptno = depno;
end;
a. 注册驱动类,并获取数据库连接
b. 用过程调用SQL语句(用{}括起来)获取CallableStatement对象。
c. 设置输入参数,如:cs.setInt(1, 7788);
d. 注册输出参数,如:cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
e. 执行过程cs.execute();
f. 获取过程返回结果,如:ResultSet rs = (ResultSet)cs.getObject(2);
g. 最后在finally中关闭资源。
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class TestPro1 {
static final int empno = 7788;
static final int depno = 10;
public static void main(String[] args) {
Connection con = null;
CallableStatement cs = null;
try {
//注册JDBC驱动类
Class.forName("oracle.jdbc.driver.OracleDriver");
//获取连接
con = DriverManager.
getConnection("jdbc:oracle:thin:@localhost:1521:orcltest", "test", "mm");
/************************* getNameByNo start ****************************/
cs = con.prepareCall("{call getNameByNo(?,?)}");
//设置参数
cs.setInt(1, empno);
//注册输出参数
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
//执行过程
cs.execute();
//获取结果
String ename = cs.getString(2);
System.out.println("编号为" + empno + " 的姓名为:" + ename);
//编号为7788 的姓名为:SCOTT
/************************* getNameByNo end ****************************/
/************************* getByDeptno start ****************************/
cs = con.prepareCall("{call getByDeptno(?, ?)}");
//设置参数
cs.setInt(1, depno);
//注册输出参数
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
//得到结果集
ResultSet rs = (ResultSet)cs.getObject(2);
System.out.println("部门号为" + depno + "的所有员工如下:");
while(rs.next()) {
System.out.println("员工编号:"+rs.getInt(1)+",员工姓名:"+rs.getString(2));
}
/************************* getByDeptno end ****************************/
//关闭资源(应在finally, 由于是示例就在这里关了)
cs.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项:
1.对于存储过程的输入参数,使用setXXX;对于输出参数,使用registerOutParameter,问号的顺序要对应,同时需要考虑类型。
2.取出存储过程返回值的方法是CallableStatement提供的getXX()注意输出参数的位置,同时也需要考虑输出参数的类型。
附:
1、什么是存储过程。存储过程是数据库服务器端的一段程序,它有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。
2、什么时候需要用存储过程
如果服务器定义了存储过程,应当根据需要决定是否要用存储过程。存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的。在服务器上执行存储过程,可以改善应用程序的性能。这是因为:
.服务器往往具有强大的计算能力和速度。
.避免把大量的数据下载到客户端,减少网络上的传输量。
例如,假设一个应用程序需要计算一个数据,这个数据需要涉及到许多记录。如果不使用存储过程的话,把这些数据下载到客户端,导致网络上的流量剧增。
不仅如此,客户端可能是一台老掉牙的计算机,它的运算速度很慢。而改用存储过程后,服务器会很快地把数据计算出来,并且只需传递一个数据给客户端,其效率之高是非常明显的。
3、存储过程的参数
要执行服务器上的存储过程,往往要传递一些参数。这些参数分为四种类型:
第一种称为输入参数,由客户程序向存储过程传递值。
第二种称为输出参数,由存储过程向客户程序返回结果。
第三种称为输入/输出参数,既可以由客户程序向存储过程传递值,也可以由存储过程向客户程序返回结果。
第四种称为状态参数,由存储过程向客户程序返回错误信息。
要说明的是,并不是所有的服务器都支持上述四种类型的参数,例如,InterBase就不支持状态参数。
相关推荐
OracleParameter param = cmd.Parameters.Add("return_value", OracleDbType.Varchar2, ParameterDirection.ReturnValue); param.ArrayBindSize = myList.Count; param.CollectionType = OracleCollectionType....
FUNCTION GET_VALUE RETURN VARCHAR2; PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2); END PKG_REPORT; CREATE OR REPLACE PACKAGE BODY PKG_REPORT IS M_V VARCHAR2(6); PROCEDURE SET_VALUE(PS_TIME IN ...
在Oracle数据库系统中,函数和存储过程是数据库管理员和开发人员进行数据操作和业务逻辑处理的重要工具。本文将详细介绍如何在不同的环境中调用Oracle的函数和存储过程。 首先,了解函数与存储过程的区别。函数是...
2. **有返回值的存储过程**:使用`OUT`参数或`RETURN`语句返回单个值,Java调用时同样通过CallableStatement,指定输出参数。 3. **返回列表**:使用`REF CURSOR`类型作为`OUT`参数,返回一个游标,Java中需遍历并...
Oracle过程是数据库管理系统中的一种重要组成部分,主要用于存储和执行复杂的业务逻辑或数据库操作。在这个例子中,我们将深入探讨Oracle过程的使用,以及如何通过“架包”(可能指的是Oracle的包,即PL/SQL包)来...
Member Function ODCIAggregateTerminate(self In Out strcat_type,ReturnValue Out varchar2,flags in Number) Return Number ); / --2. 创建类型体 Create Or Replace Type Body Strcat_type Is Static ...
函数的声明和使用方式类似,只是用`FUNCTION`替换`PROCEDURE`,并在`RETURN`关键字后指定返回值的数据类型。 9. **包(Package)**: - 包是组织存储过程和函数的容器,可以包含公共和私有对象。包由包规范(声明...
Oracle 自定义函数是数据库开发中的重要工具,允许开发者创建具有特定功能的代码块,以便在查询或业务逻辑中重用。这些函数可以根据需求返回特定的数据类型,并可以通过 IN、OUT 或 IN OUT 参数接收和传递数据。 1....
### Oracle存储过程的基本语法 #### 3.1.1 基本结构 在Oracle数据库中,存储过程是一种可重复使用的数据库对象,用于封装一系列SQL命令或其他PL/SQL语句,以便于执行复杂的业务逻辑。存储过程的基本结构如下: ``...
int returnValue = cs.getInt(1); ``` 这里的`1`代表参数的位置索引,`Types.INTEGER`是Java.sql.Types中的常量,对应Oracle的NUMBER数据类型。 3. **返回参数集合的存储过程**: 对于返回参数集合的情况,通常...
根据提供的文件信息,我们可以归纳出以下关于Oracle PL/SQL编程的重要知识点: ### 一、创建包(Package)及其声明 #### Package Specification (包规范) 在Oracle数据库中,**包**是一种将过程、函数、类型、游标...
int returnValue = cs.getInt(1); ``` 7. **关闭资源**:在完成操作后,记得关闭`CallableStatement`、`Connection`等资源,以避免资源泄露: ```java cs.close(); conn.close(); ``` 在实际应用中,你可能...
### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...
Oracle PL/SQL是Oracle数据库系统中的一个强大工具,它结合了SQL的数据操作能力和Procedural Language(过程化语言)的功能,使得数据库管理、数据处理和应用程序开发更为高效。本篇文章将深入探讨Oracle PL/SQL存储...
### Oracle 存储过程与函数详解 #### 6.1 引言 Oracle数据库中的存储过程和函数是PL/SQL编程的重要组成部分。它们是数据库中存储的命名块,可以通过调用其名称来执行预定义的任务。这些命名块有助于实现业务逻辑、...
$conn = oci_connect('username', 'password', 'localhost/oracle_service_name'); ``` 其中,'username'是数据库用户名,'password'是对应的密码,'localhost/oracle_service_name'是Oracle的服务名。 2. **...
session.createNativeQuery("BEGIN YOUR_PACKAGE.YOUR_PROCEDURE; END;") .executeUpdate(); transaction.commit(); session.close(); ``` 如果存储过程或函数需要传入参数,我们可以这样处理: ```java String ...
- 注意点: Oracle使用 `START WITH` 和 `CONNECT BY` 进行层次查询,而DB2使用 `WITH RECURSIVE` 子句。 #### 9. 打印输出信息 - **Oracle** 和 **DB2** 都支持打印输出信息。 - Oracle示例: ```sql DBMS_...
通过Java JDBC连接到Oracle数据库,并调用上面创建的存储过程。这一步骤通常涉及到设置数据库连接、创建PreparedStatement对象以及执行存储过程。 ```java Connection conn = DriverManager.getConnection("jdbc:...
### ORACLE转DB2对照全解 #### 一、Oracle SQL PL与DB2 inline SQL PL对比 本章节主要介绍Oracle SQL PL与DB2 inline SQL PL之间的对比,包括但不限于存储过程、触发器、用户定义函数(UDF)、条件语句及流程控制...