`

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存储过程学习经典[语法+实例+调用].

    Oracle存储过程基础知识 Oracle存储过程的基本语法 Oracle存储过程的若干问题备忘 用Java调用Oracle存储过程总结 在存储过程中做简单动态查询 Oracle存储过程调用Java方法

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

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

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

    商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是...

    Oracle_PLSQL_存储过程

    Oracle存储过程基础知识; Oracle存储过程的基本语法; 用Java调用Oracle存储过程总结; 在存储过程中做简单动态查询; Oracle存储过程调用Java方法; Oracle高效分页存储过程实例

    代码自动生成工具(vb类 java类 sql存储过程...)

    通过调用数据库连接对话框建立数据库连接 (目前测试支持 MSSQL, Oracle, Access, MySql) 根据自定义模板通过数据库表、视图和存储过程批量生成代码, 模板编辑和代码查看支持语法高亮 (Java, VB, T-SQL) 可以...

    java开源包1

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    java开源包10

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    oracle进阶之PLSQL编程.rar_oracle_oracle 编程_应用于java程序

    通过学习PL/SQL基础语法和函数、存储过程、包、触发器等数据库对象的概念、基本语法及应用,达到学以致用的目的,并能在应用程序中调用存储函数及过程

    自学oracle存储过程

    用 Java 调用 Oracle 存储过程总结.................................................................................................. 6 一、 无返回值的存储过程...............................................

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包11

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    java开源包4

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    java开源包6

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    java开源包9

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    java开源包101

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    java开源包5

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

Global site tag (gtag.js) - Google Analytics