首页 > 数据库 >Java_procedure with return value(oracle)

Java_procedure with return value(oracle)

时间:2023-04-14 11:33:55浏览次数:31  
标签:存储 Java cursor cs 参数 oracle return 过程 out

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

标签:存储,Java,cursor,cs,参数,oracle,return,过程,out
From: https://blog.51cto.com/u_16070335/6189770

相关文章

  • Java使用TensorFlow
    Java可以使用TensorFlow,TensorFlow为Java提供了一个API,它可以让Java开发者使用TensorFlow构建和训练深度学习模型。以下是如何在Java中使用TensorFlow的基本步骤:首先,需要安装TensorFlow的JavaAPI,可以从TensorFlow官网下载安装包,或者通过Maven或Gradle添加依赖。然后,在Java......
  • MariaDB_About the MariaDB Java Client
    via: https://mariadb.com/kb/en/about-the-mariadb-java-client/ IntroductionTheMariaDBClientLibraryforJavaApplicationsisaType4JDBCdriver.ItwasdevelopedspecificallyasalightweightJDBCconnectorforusewithMySQLandMariaDBdatabaseser......
  • Maven_How To Add Oracle JDBC Driver In Your Maven Local Repository
    via: http://www.mkyong.com/maven/how-to-add-oracle-jdbc-driver-in-your-maven-local-repository/ DuetoOraclelicenserestriction,thereisNOpublicMavenrepositoryprovidesOracleJDBCdriver.TouseOraclejdbcdrivewithMaven,youhavetoinstallit......
  • Java中File类中常用的一些方法
    File.delete()删除文件或文件夹目录。File.createNewFile()创建一个新的空文件。File.mkdir()创建一个新的空文件夹。File.list()获取指定目录下的文件和文件夹名称。File.listFiles()获取指定目录下的文件和文件夹对象。File.exists......
  • 半小时实现Java网络爬虫框架
    最近在做一个搜索相关的项目,需要爬取网络上的一些链接存储到索引库中,虽然有很多开源的强大的爬虫框架,但本着学习的态度,自己写了一个简单的网络爬虫,以便了解其中的原理。今天,就为小伙伴们分享下这个简单的爬虫程序!!首先介绍每个类的功能:DownloadPage.java的功能是下载此超链接的页......
  • Oracle_数组
     Oracle数组一般可以分为固定数组和可变数组集合:是具有相同定义的元素的聚合。Oracle有两种类型的集合:可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值。嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限制值。在PL/SQL中是没有数组(Array)概念的。但是如果程......
  • Java_判断操作系统类型
    Java判断操作系统类型(适用于各种操作系统)/***平台*@authorisea533*/publicenumEPlatform{Any("any"),Linux("Linux"),Mac_OS("MacOS"),Mac_OS_X("MacOSX"),Windows("Windows"),OS2("OS......
  • Java基础---数据类型
    数据类型Java的两大数据类型:内置数据类型、引用数据类型内置数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。byte、short、int、long、float、double、char、boolean基本类型范围byte:(8位)-128~127short:(26......
  • 解决 dpkg 安装出错后的 Sub-process /usr/bin/dpkg returned an error code (1) 错误
    在使用dpkg-i安装.deb软件包的过程中,会出现安装失败的可能。之后无论用sudoaptinstall-forsudaptautoremove等常见的修复命令都是无效的。网络上很多解决方案都直接给出需要运行的命令,不分析原因也不说明理由。我从来不尝试这样的解决方案,除非我自己知道或是只能死马......
  • JavaScript 之 confirm,alert,prompt
    //confirmfunctiondisp_confirm(){varr=confirm("Pressabutton!")if(r==true){alert("YoupressedOK!")}else{alert("YoupressedCancel!")}}//alert<script>window.alert("确......