`
商志亮
  • 浏览: 14548 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中调用ORACLE存储过程实例(一)

阅读更多

 一:无返回值的存储过程

存储过程:

   create or replace procedure DATA_TEST_PROC  (dqBM in varchar2,strTime in varchar2)

  is

      type cur is ref cursor ; --定义游标
      TABLE_CUR cur;  --设置游标别名
      tabel_name_count number; --定义number类型变量
      isExite number; --同上
      i number :=1;  -- 定义number类型变量并赋初始值

BEGIN -- 1

     Open TABLE_CUR for
      'select count(table_name) from user_tables where table_name like '''||UPPER(dqBM)||'HISTORY%''';
     FETCH TABLE_CUR INTO tabel_name_count; --获取游标存储值

     CLOSE TABLE_CUR; -- 关闭游标

     if tabel_name_count > 0

        then

             begin  -- 2

                  for i in 1..table_name_count

                    loop

                       Open Table_CUR for

                          ' select count(*) from '|| dqBM|| ' analysis'||i||' where id like ''' || strTime||'% ''';

                       FETCH TABLE_CUR INTO isExite;

                       CLOSE TABLE_CUR;

                       if isExite > 0

                          then

                            begin --  3

                               execute immediate   ' delete from '||dqBM||'analysis'||i||' where id like ''' ||strTime||'%'';

                                commit;

                                DBMS_OUTPUT.put_line(strTime||' 数据已删除');

                            end;--  3

                    end loop;

             end; -- 2

END;-- 1

 

本存储过程实现查询数据库中已存在指定数据并删除。

 

然后呢,在java里调用时就用下面的代码:

 

package com.hyq.src;

import java.sql.*;
import java.sql.ResultSet;

public class TestProcedureOne {
   public TestProcedureOne() {
   }
   public static void main(String[] args ){
     String driver = "oracle.jdbc.driver.OracleDriver";
     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: imsbase";
     Statement stmt = null;
     ResultSet rs = null;
     Connection conn = null;
     CallableStatement cstmt = null;

     try {
       Class.forName(driver);
       conn =   DriverManager.getConnection(strUrl, " mis", " mis ");
       CallableStatement proc = null;
       proc = conn.prepareCall("{ call HBPGMIS_MONITOR.DATAANALYSIS_DAY_DQ(?,?)}");
       proc.setString(1, "bd");
       proc.setString(2, "20100301");
       proc.execute();
     }
     catch (SQLException ex2) {
       ex2.printStackTrace();
     }
     catch (Exception ex2) {
       ex2.printStackTrace();
     }
     finally{
       try {
         if(rs != null){
           rs.close();
           if(stmt!=null){
             stmt.close();
           }
           if(conn!=null){
             conn.close();
           }
         }
       }
       catch (SQLException ex1) {
       }
     }
   }
}

  

二、调用有返回值的存储过程

 

   存储过程如下:

  

create or replace procedure proc_getHisTabCount (dqbm in varchar2, hisTabCount OUT integer)
   is
    --声明全局变量
      var_sql String(32765);
      sql_select varchar2(1000);
      num_count number;
      type CurType is ref cursor;-- 定义游标引用
      curTerm CurType; -- 设置游标别名
    BEGIN
        Open curTerm for
        'select count(*) from user_all_tables where table_name like '''||UPPER(dqbm)||'HISTORY%''';
        FETCH curTerm INTO num_count;
        CLOSE curTerm;
        if num_count > 0
          then
          hisTabCount  := num_count;
          end if;
    END proc_getHisTabCount;

 

   以上存储过程有两个参数:一个输入参数,一个输出参数。

   实现查询用户对象中表名称like 'HISTORY%'的个数。并返回。

 

   对应java调用如下:

 

  

import java.sql.*;
import java.sql.ResultSet;

public class TestProcedureOne {
   public TestProcedureOne() {
   }
   public static void main(String[] args ){
     String driver = "oracle.jdbc.driver.OracleDriver";
     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: imsbase";
     Statement stmt = null;
     ResultSet rs = null;
     Connection conn = null;
     CallableStatement cstmt = null;

     try {
       Class.forName(driver);
       conn =   DriverManager.getConnection(strUrl, " mis", " mis ");
       CallableStatement proc = null;
       proc = conn.prepareCall("{ call HBPGMIS_MONITOR.proc_getHisTabCount(?,?)}");
				    if(proc != null)
				    {
				    	proc.setString(1, "bd"); //设置第一个参数,set输入参数,注意第一个参数是存储过程中的列值
				    	proc.registerOutParameter(2,Types.INTEGER); // 设置第二个参数,注册输出参数 ,若有多个参数,则注册多个几个
				    	proc.execute(); //提交存储过程
				    	output = proc.getInt(2); //以字符串的形式获取输出参数。
				    	System.out.println(output);
				    }
     }
     catch (SQLException ex2) {
       ex2.printStackTrace();
     }
     catch (Exception ex2) {
       ex2.printStackTrace();
     }
     finally{
       try {
         if(rs != null){
           rs.close();
           if(stmt!=null){
             stmt.close();
           }
           if(conn!=null){
             conn.close();
           }
         }
       }
       catch (SQLException ex1) {
       }
     }
   }
}

 其中,output = proc.getInt(2); 是过去存储过程对应的列out参数列。如果out在第三列,则getInt(3),若有多个out参数,则注册(.registerOutParameter)多个值,并按列号取值。

 

三、返回列表值

  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,但可以用游标存储。

1。 应用package,分两部分做。

     a。   建一个程序包,包内只定义一个游标。如下:

   

  create or replace package pack_cursor is
  -- Author  : ADMINISTRATOR
  -- Created : 2010-4-8 10:29:16
  -- Purpose : 创建游标获取数据列表
  -- Public type declarations 公共类型声明
  type TYPE_CURS is REF CURSOR; --创建游标引用
  end pack_cursor; 

   

    b.  建立存储过程,如:

   

create or replace procedure proc_getcursor_value(p_cursor out PACK_CURSOR.TYPE_CURS)
is
type type_cur is ref cursor;
term_type type_cur;
cur_value varchar2(20);
rows_num integer;
begin
  Open term_type for
    select name from measureclass t where display = '3';
  loop
    fetch term_type into cur_value; -- 从游标p_cursor中读取值
    exit  when term_type%notfound; --(dbms_sql.fetch_rows(p_cursor)>0) 通过dbms_sql.fetch_rows(p_cursor)获取游标的行
    if term_type%found
      then 
            dbms_output.put_line(cur_value);
    end if;
  end loop;
  close term_type;
end proc_getcursor_value;

  

以下是java代码调用:

 

import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;


public class TestProcedureTHREE {
   public TestProcedureTHREE() {
   }
   public static void main(String[] args ){
     String driver = "oracle.jdbc.driver.OracleDriver";
     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:imsbase";
     Statement stmt = null;
     ResultSet rs = null;
     Connection conn = null;

     try {
       Class.forName(driver);
       conn =   DriverManager.getConnection(strUrl, "mis", "mis");
       System.out.println("调用存储过程!:");
     ResultSet rSet = null;
     CallableStatement  proc  = con.prepareCall("{ call HBPGMIS_MONITOR.proc_getcursor_value(?)}");
     System.out.println("注册参数:");
     proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
     System.out.println("提交!:");
     proc.execute();
     System.out.println("执行完毕!:");
     rSet = (ResultSet)proc.getObject(1);
     System.out.println("查询:");
     while (rSet.next()) 
     {
            System.out.println(rSet.getString(1));      
     }     
   }
     catch (SQLException ex2) {
       ex2.printStackTrace();
     }
     catch (Exception ex2) {
       ex2.printStackTrace();
     }
     finally{
       try {
         if(rs != null){
           rs.close();
           if(stmt!=null){
             stmt.close();
           }
           if(conn!=null){
             conn.close();
           }
         }
       }
       catch (SQLException ex1) {
       }
     }
   }
}

 

   

分享到:
评论

相关推荐

    java调用oracle存储过程入门实例 增删改查

    在Java中调用Oracle存储过程,我们需要使用JDBC(Java Database Connectivity),这是Java标准库提供的一组接口和类,用于与各种数据库进行通信。首先,我们需要添加Oracle JDBC驱动到项目中,例如ojdbc.jar。 1. *...

    用java调用oracle存储过程

    以上代码展示了如何在Java中调用Oracle数据库的三种类型的存储过程:无返回值的存储过程、有单个返回值的存储过程以及返回列表的存储过程。对于无返回值的存储过程,主要涉及的是参数的输入,通过`execute()`方法...

    java调用Oracle存储过程实例

    一个完整的java调用Oracle存储过程的实例,含存储过程和代码注释

    java调用oracle存储过程实现增删改查

    在Java编程中,调用Oracle数据库的存储...总之,通过Java调用Oracle存储过程,我们可以有效地执行数据库操作,同时利用存储过程带来的性能和安全优势。了解如何正确设置参数、执行和处理结果是成功实现这一目标的关键。

    java调用存储过程实例

    根据提供的文件信息,我们可以深入解析如何在Java中通过JDBC(Java Database Connectivity)调用Oracle数据库的存储过程。 ### Java调用存储过程实例:详解 #### 存储过程简介 存储过程是一种在数据库中编写的SQL...

    java调用Oracle存储过程

    在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或数据操作时。本文将深入探讨如何使用Java与...记住,实践是最好的老师,尝试编写一个简单的Java程序来调用Oracle存储过程,加深理解。

    java调用oracle存储过程

    Java调用Oracle存储过程是数据库操作中常见的任务,特别是在需要执行复杂业务逻辑或者批量处理数据时。本篇文章将详细介绍如何通过Java与Oracle数据库交互,调用存储过程,并提供几个简单的实例帮助新手理解。 首先...

    Java调用oracle存储过程输出自定义对象或二维表

    本文将深入探讨如何在Java中调用Oracle存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们需要理解Java与Oracle数据库的连接方式。Java通过JDBC(Java Database Connectivity)API来实现对...

    Springboot调用Oracle存储过程的几种方式.docx

    在Spring Boot应用中,调用Oracle数据库的存储过程有多种方式。本文主要介绍三种方法,包括使用`entityManagerFactory.unwrap(SessionFactory.class).openSession()`、直接使用`EntityManager`的`...

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    CallabledStatement 是 Java 中的一种接口,用于调用存储过程。CallabledStatement interface 是 Statement 的一个子接口,提供了一些特殊的方法来调用存储过程。使用 CallabledStatement 可以提高应用程序的性能和...

    java 与 oracle 存储过程

    这篇博文(虽然链接未提供具体内容)可能探讨了如何在Java中调用Oracle存储过程,下面将详细介绍这个主题的相关知识点: 1. **JDBC API**:Java通过JDBC API与数据库通信,包括连接数据库、执行SQL语句和存储过程。...

    java 调用存储过程 实例

    为了在Java中调用Oracle存储过程,我们需要使用JDBC(Java Database Connectivity)API。JDBC是Java平台的标准接口,用于与各种类型的数据库进行通信。以下是一步步教你如何实现的步骤: 1. **导入必要的库**: 在...

    oracle的一个简单存储过程实例

    Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写包含一系列SQL语句和PL/SQL块的可重用代码段。在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储...

    Java调用存储过程--传入集合参数

    通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合参数的基本原理,还深入实践了相关的技术细节。这对于构建高性能、高可靠性的企业级应用而言,是不可或缺的知识点。在未来,随着数据量的...

    java 调用存储过程

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

    java中调用ORACLE存储过程[整理].pdf

    总结,Java调用Oracle存储过程主要涉及以下步骤: 1. 导入必要的JDBC库。 2. 加载数据库驱动并建立连接。 3. 创建`CallableStatement`对象,设置参数(包括输入和输出参数)。 4. 调用`execute`方法执行存储过程。 5...

    java中调用oracle的存储过程

    总结起来,Java调用Oracle存储过程涉及JDBC、CallableStatement、参数设置以及结果获取等多个环节。理解这些概念并熟练运用,对于Java开发者来说是至关重要的,尤其是在处理与数据库交互的复杂业务场景中。

Global site tag (gtag.js) - Google Analytics