`

Java_procedure with return value(oracle)

    博客分类:
  • Java
 
阅读更多

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;

 

2) java中调用的过程

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就不支持状态参数。

分享到:
评论

相关推荐

    C# 传入自定义列表List 到Oracle存储过程

    OracleParameter param = cmd.Parameters.Add("return_value", OracleDbType.Varchar2, ParameterDirection.ReturnValue); param.ArrayBindSize = myList.Count; param.CollectionType = OracleCollectionType....

    oracle带参数视图

    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数据库系统中,函数和存储过程是数据库管理员和开发人员进行数据操作和业务逻辑处理的重要工具。本文将详细介绍如何在不同的环境中调用Oracle的函数和存储过程。 首先,了解函数与存储过程的区别。函数是...

    oracle存储过程学习经典[语法+实例+调用]

    2. **有返回值的存储过程**:使用`OUT`参数或`RETURN`语句返回单个值,Java调用时同样通过CallableStatement,指定输出参数。 3. **返回列表**:使用`REF CURSOR`类型作为`OUT`参数,返回一个游标,Java中需遍历并...

    一个简单的oracle过程被使用的例子,包含架包

    Oracle过程是数据库管理系统中的一种重要组成部分,主要用于存储和执行复杂的业务逻辑或数据库操作。在这个例子中,我们将深入探讨Oracle过程的使用,以及如何通过“架包”(可能指的是Oracle的包,即PL/SQL包)来...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    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 ...

    oracle存储过程培训材料(动画版本).pptx

    函数的声明和使用方式类似,只是用`FUNCTION`替换`PROCEDURE`,并在`RETURN`关键字后指定返回值的数据类型。 9. **包(Package)**: - 包是组织存储过程和函数的容器,可以包含公共和私有对象。包由包规范(声明...

    Oracle自定义函数

    Oracle 自定义函数是数据库开发中的重要工具,允许开发者创建具有特定功能的代码块,以便在查询或业务逻辑中重用。这些函数可以根据需求返回特定的数据类型,并可以通过 IN、OUT 或 IN OUT 参数接收和传递数据。 1....

    Oracle_存储过程的基本语法

    ### Oracle存储过程的基本语法 #### 3.1.1 基本结构 在Oracle数据库中,存储过程是一种可重复使用的数据库对象,用于封装一系列SQL命令或其他PL/SQL语句,以便于执行复杂的业务逻辑。存储过程的基本结构如下: ``...

    java调用Oracle存储过程的简单例子源码

    int returnValue = cs.getInt(1); ``` 这里的`1`代表参数的位置索引,`Types.INTEGER`是Java.sql.Types中的常量,对应Oracle的NUMBER数据类型。 3. **返回参数集合的存储过程**: 对于返回参数集合的情况,通常...

    oracle笔记二--plsql 编程.txt

    根据提供的文件信息,我们可以归纳出以下关于Oracle PL/SQL编程的重要知识点: ### 一、创建包(Package)及其声明 #### Package Specification (包规范) 在Oracle数据库中,**包**是一种将过程、函数、类型、游标...

    用JDBC操作Oracle的存储过程返回值

    int returnValue = cs.getInt(1); ``` 7. **关闭资源**:在完成操作后,记得关闭`CallableStatement`、`Connection`等资源,以避免资源泄露: ```java cs.close(); conn.close(); ``` 在实际应用中,你可能...

    oracle到sqlserver存储过程语法转换

    ### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...

    Oracle PL SQL存储过程以及函数编

    Oracle PL/SQL是Oracle数据库系统中的一个强大工具,它结合了SQL的数据操作能力和Procedural Language(过程化语言)的功能,使得数据库管理、数据处理和应用程序开发更为高效。本篇文章将深入探讨Oracle PL/SQL存储...

    oracle 存储过程学习

    ### Oracle 存储过程与函数详解 #### 6.1 引言 Oracle数据库中的存储过程和函数是PL/SQL编程的重要组成部分。它们是数据库中存储的命名块,可以通过调用其名称来执行预定义的任务。这些命名块有助于实现业务逻辑、...

    PHP Oracle.rar

    $conn = oci_connect('username', 'password', 'localhost/oracle_service_name'); ``` 其中,'username'是数据库用户名,'password'是对应的密码,'localhost/oracle_service_name'是Oracle的服务名。 2. **...

    hibernate query调用oracle存储过程

    session.createNativeQuery("BEGIN YOUR_PACKAGE.YOUR_PROCEDURE; END;") .executeUpdate(); transaction.commit(); session.close(); ``` 如果存储过程或函数需要传入参数,我们可以这样处理: ```java String ...

    oracle转DB2 对照

    - 注意点: Oracle使用 `START WITH` 和 `CONNECT BY` 进行层次查询,而DB2使用 `WITH RECURSIVE` 子句。 #### 9. 打印输出信息 - **Oracle** 和 **DB2** 都支持打印输出信息。 - Oracle示例: ```sql DBMS_...

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

    通过Java JDBC连接到Oracle数据库,并调用上面创建的存储过程。这一步骤通常涉及到设置数据库连接、创建PreparedStatement对象以及执行存储过程。 ```java Connection conn = DriverManager.getConnection("jdbc:...

    ORACLE转DB2对照全解

    ### ORACLE转DB2对照全解 #### 一、Oracle SQL PL与DB2 inline SQL PL对比 本章节主要介绍Oracle SQL PL与DB2 inline SQL PL之间的对比,包括但不限于存储过程、触发器、用户定义函数(UDF)、条件语句及流程控制...

Global site tag (gtag.js) - Google Analytics