`

oracle--存储过程语法与Java程序的调用方式

 
阅读更多
创建测试表
create table
xuesheng(id integer, xing_ming varchar2(25), yu_wen number, shu_xue number);
添加测试数据
insert into xuesheng values(1,'zhangsan',80,90)
insert into xuesheng values(2,'lisi',85,87)

一、无返回值存储过程
create or replace procedure xs_proc_no is
begin
   insert into xuesheng values(3,'wangwu',90,90);
   commit;
end xs_proc_no;
二、有单个数据值返回的存储过程
create or replace procedure xs_proc(temp_name in varchar2,
                                                       temp_num out number)is
   num_1 number;
   num_2 number;
begin
   select yu_wen,shu_xue into num_1,num_2 from xuesheng
   where xing_ming=temp_name;
   ---dbms_output.put_line(num_1+num_2);
   temp_num:=num_1+num_2;
end;
三、有返回值的存储过程(列表返回)
首先,建立我们自己的包,并定义包中的一个自定义ref cursor
create or replace package mypackage as
  type my_cursor is ref cursor;
end mypackage;
在定义了ref cursor后,可以书写我们的程序代码
create or replace procedure xs_proc_list(shuxue in number,
                                                            p_cursor out mypackage.my_cursor)is
begin
  open p_cursor for
     select * from xuesheng where shu_xue >shuxue;
end xs_proc_list;

程序调用
在本节中,我们使用java语言调用存储过程。其中,关键是使用CallableStatement这个对象,代码如下:
?
String oracleDriverName = "oracle.jdbc.driver.OracleDriver";

        // 以下使用的Test就是Oracle里的表空间
        String oracleUrlToConnect = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
        Connection myConnection = null;
        try {
            Class.forName(oracleDriverName);
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        try {
            myConnection = DriverManager.getConnection(oracleUrlToConnect,
                    "xxxx", "xxxx");//此处为数据库用户名与密码

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        try {
            
            CallableStatement proc=null;
            proc=myConnection.prepareCall("{call xs_proc(?,?)}");
            proc.setString(1, "zhangsan");
            proc.registerOutParameter(2, Types.NUMERIC);
            proc.execute();
            String teststring=proc.getString(2);
            System.out.println(teststring);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

对于列表返回值的存储过程,在上述代码中做简单修改。如下
复制代码

CallableStatement proc=null;
proc=myConnection.prepareCall("{call getdcsj(?,?,?,?,?)}");
proc.setString(1, strDate);
proc.setString(2, jzbh);
proc.registerOutParameter(3, Types.NUMERIC);
proc.registerOutParameter(4, OracleTypes.CURSOR);
proc.registerOutParameter(5, OracleTypes.CURSOR);
proc.execute();
ResultSet rs=null;
int total_number=proc.getInt(3);
rs=(ResultSet)proc.getObject(4);

复制代码

上述存储过程修改完毕。另外,一个复杂的工程项目中的例子:查询一段数据中间隔不超过十分钟且连续超过100条的数据。即上述代码所调用的getdcsj存储过程
?
create or replace procedure getDcsj(var_flag     in varchar2,
                                    var_jzbh     in varchar2,
                                    number_total out number,
                                    var_cursor_a out mypackage.my_cursor,
                                    var_cursor_b out mypackage.my_cursor) is
  total number;
  cursor cur is
    select sj, flag
      from d_dcsj
     where jzbh = var_jzbh
     order by sj desc
       for update;
  last_time date;
begin
  for cur1 in cur loop
    if last_time is null or cur1.sj >= last_time - 10 / 60 / 24 then
      update d_dcsj set flag = var_flag where current of cur;
      last_time := cur1.sj;
    else
      select count(*) into total from d_dcsj where flag = var_flag;
      dbms_output.put_line(total);
      if total < 100 then
        update d_dcsj set flag = null where flag = var_flag;
        last_time := null;
        update d_dcsj set flag = var_flag where current of cur;
      else
        open var_cursor_a for
          select *
            from d_dcsj
           where flag = var_flag
             and jzbh = var_jzbh
             and zh = 'A'
           order by sj desc;
        number_total := total;
        open var_cursor_b for
          select *
            from d_dcsj
           where flag = var_flag
             and jzbh = var_jzbh
             and zh = 'B'
           order by sj desc;
        number_total := total;
        exit;
      end if;
    end if;
  end loop;
  select count(*) into total from d_dcsj where flag = var_flag;
  dbms_output.put_line(total);
  if total < 100 then
    open var_cursor_a for
      select * from d_dcsj where zh = 'C';
    open var_cursor_b for
      select * from d_dcsj where zh = 'C';
  else
    open var_cursor_a for
      select *
        from d_dcsj
       where flag = var_flag
         and jzbh = var_jzbh
         and zh = 'A'
       order by sj desc;
    number_total := total;
    open var_cursor_b for
      select *
        from d_dcsj
       where flag = var_flag
         and jzbh = var_jzbh
         and zh = 'B'
       order by sj desc;
    number_total := total;
  end if;
  commit;
end;
/
源资源:http://www.cnblogs.com/liliu/archive/2011/06/22/2087546.html
分享到:
评论

相关推荐

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

    - **Java调用Oracle存储过程**:使用Hibernate框架或纯Java代码可以实现调用Oracle存储过程的功能。 - 无返回值的存储过程调用较为简单。 - 有返回值的存储过程需要特别处理返回值。 - 返回列表的存储过程需通过...

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

    - **用Java调用Oracle存储过程**:使用`CallableStatement`接口来调用存储过程,设置输入参数,执行存储过程并获取输出结果。 #### 动态查询在存储过程中的应用 - **本地动态SQL**:在存储过程中构建动态SQL语句,...

    java调用Oracle存储过程的代码

    总结,通过Java调用Oracle存储过程,我们需要配置JDBC驱动,建立数据库连接,创建CallableStatement,设置参数,执行存储过程,并处理返回的结果。在这个例子中,我们展示了如何调用一个简单的存储过程并打印返回的...

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

    #### 四、用Java调用Oracle存储过程 **1. 无返回值的存储过程** - **调用示例**: ```java Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger"); ...

    java调用存储过程(含out参数)

    在Java编程中,调用数据库的存储过程是常见的任务,特别是在处理复杂的业务逻辑或需要高效数据操作时。本文将详细讲解如何在Java中调用含有`OUT`参数的存储过程,帮助开发者解决这类问题。 首先,理解存储过程的...

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

    Oracle存储过程是数据库管理系统Oracle中的一个重要...理解并熟练掌握Oracle存储过程的语法和调用方式,对于提升数据库管理效率和应用程序性能具有重要意义。通过不断学习和实践,可以更好地应对各种数据库编程挑战。

    java 调用存储过程

    值得注意的是,上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用存储过程无关,它们看起来像是Delphi或FreePascal项目的文件,这些文件通常用于描述项目配置、单元信息、表单布局等,而不是与Java...

    Java-Oracle存储过程知识

    Java-Oracle存储过程是数据库中一种重要的数据库对象,主要用于封装业务逻辑,能够将一组实现特定功能的SQL语句集合起来,进行预编译和优化存储在数据库服务器中,并通过名称来调用执行。存储过程的特点包括提高执行...

    oracle存储过程学习经典入门

    用 Java 调用 Oracle 存储过程时,需要使用 JDBC 驱动程序来连接 Oracle 数据库,然后使用 CallableStatement 对象来调用存储过程。 在存储过程中做简单动态查询 在存储过程中,做简单动态查询需要使用 EXECUTE ...

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

    **Oracle存储过程**是一种可以在Oracle数据库中存储并可被多次调用的程序单元。它可以包含一系列SQL语句和控制流语句,用于执行复杂的操作。存储过程的主要优势在于它们能够提高应用性能、减少网络流量,并提供更高...

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

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

    Oracle存储过程是构建在Oracle数据库中的一个独立的代码块,能够封装复杂的业务逻辑,让程序逻辑转移到数据库层面执行,从而提高数据处理效率和减少网络传输数据量。Oracle存储过程可以包含SQL语句、PL/SQL块、Java...

    java调用oracle sqlserver存储过程共用方法

    ### Java调用Oracle与SQL Server存储过程的通用方法 #### 1. **建立数据库连接** 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。根据`dbType`参数动态选择正确的数据源,即Oracle或SQL Server的...

Global site tag (gtag.js) - Google Analytics