`

java 调用存储过程学习笔记

阅读更多
用JDBC操作Oracle的存储过程返回值
Oracle的存储过程可以返回任何类型,包括一个ResultSet,JDBC自带的CallableStatement可以提供操作这些返回值得借口,其中我们可以通过registerOutParameter来注册需要返回的类型。CallableStatement是PrepareStatement的一个子类,但提供了返回和注册Out类型参数的功能。
我们看一下例子,在Oracle里面我们定义了一个包如下:
create or replace package GP_TESTP is
  type my_dCursor is ref cursor;
  procedure GP_Test(m_cursor2 OUT my_dCursor);
end GP_TESTP;

create or replace package body GP_TESTP is
   procedure GP_Test(m_cursor2 OUT my_dCursor) is
  begin
    open m_cursor2 for select bom.material_no,bom.product_no from gp2_bom bom where bom.year=2006 ;
  end GP_Test;
end GP_TESTP;

在JDBC里面我们可以通过如下的接口来得到返回的动态游标的内容
     Global.start(); //初始化连接池
     ConnectionWrapper wrapper=ConnectionPoolFactory.getPoolInstance().borrowConnection();//从连接池里面返回连接
     Connection conn=wrapper.getConnection();
     try {
        String callSql="{call GP_TESTP.GP_Test(?)}";
        CallableStatement cs = null;
        ResultSet rs=null;  
        cs = conn.prepareCall(callSql);
        cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
        cs.execute();
        rs = (ResultSet)cs.getObject(2);
        while(rs.next()){
            //String s=rs.get("");
            String component=rs.getString(2);
            String productNo=rs.getString(4);
            System.out.println("component="+component+"-------productNo="+productNo);
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
注意兰颜色的代码是注册动态游标和返回结果集的关键代码。



=======================================
2008年07月06日 星期日 07:41 P.M.一:无返回值的存储过程

存储过程为:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS

BEGIN

   INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);

END TESTA;

然后呢,在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: hyq ";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    CallableStatement cstmt = null;


    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");

      CallableStatement proc = null;

      proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");

      proc.setString(1, "100");

      proc.setString(2, "TestOne");

      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) {

      }

    }

}

}

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

二:有返回值的存储过程(非列表)

存储过程为:

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS

BEGIN

   SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;

END TESTB;

在java里调用时就用下面的代码:

package com.hyq.src;


public class TestProcedureTWO {
public TestProcedureTWO() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
      proc.setString(1, "100");
      proc.registerOutParameter(2, Types.VARCHAR);
      proc.execute();
      String testPrint = proc.getString(2);
      System.out.println("=testPrint=is="+testPrint);
    }
    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) {
      }
    }
}
}
}

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。


2008年07月06日 星期日 07:42 P.M.由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,

1, 建一个程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE AS

TYPE Test_CURSOR IS REF CURSOR;

end TESTPACKAGE;

2,建立存储过程,存储过程为:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS

BEGIN

    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;

END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

在java里调用时就用下面的代码:

package com.hyq.src;

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:hyq";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, "hyq", "hyq");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call hyq.testc(?) }");
      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
      proc.execute();
      rs = (ResultSet)proc.getObject(1);
      while(rs.next())
      {
          System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
      }   
   }
    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_assess_optr is
  date_cycle    varchar2(20); --周期
  start_date    varchar2(10); --开始日期
  end_date      varchar2(10); --结束日期
  region_code   varchar2(32); --region code
  db_user       varchar2(30); --用户名
  del_sql       varchar2(1000);--删除这个周期的数据
 
begin
  declare
    cursor cur_user is
      SELECT distinct DB_USER, CODE FROM REGION_CONFIG;
  begin
    start_date := to_char(last_day(add_months(SYSDATE, -2)) + 1, 'yyyy-MM-dd');--上个月的1号
    end_date   := to_char(last_day(add_months(SYSDATE, -1)) + 1 , 'yyyy-MM-dd');--这个月1号
    date_cycle := to_char(sysdate - interval '1' month, 'yyyyMM');
    --遍历所有的用户
    begin
      dbms_output.enable(1000000);
      open cur_user;
      loop
        fetch cur_user
          into db_user, region_code;
        exit when cur_user%notfound;
        begin
          del_sql := 'delete from ' || db_user ||
                     '.guideline_instance t where t.cycle_id=''' ||
                     date_cycle || ''' and t.guidline_id in(''1'',''2'',''3'',''4'')';
          DBMS_OUTPUT.put_line(del_sql);
          execute immediate del_sql; --动态立即执行一个SQL语句
          ---具体数据分析执行
          proc_assess_optr_exeute(db_user,
                                  start_date,
                                  end_date,
                                  date_cycle);
        end;
      end loop;
      close cur_user;
      commit;
    end;
  end;
end proc_assess_optr;
/
分享到:
评论

相关推荐

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。  《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是...

    MySQL5学习笔记

    MySQL存储过程之java调用 9 MySQL存储过程实现动态查询 12 MySQL应用总结 12 MySQL数据管理 15 数据管理 15 MySQL数据导出 15 MySQL数据还原 15 MySQL灾难性复制恢复总结 16 MySQL授权管理 17 未解决及已解决问题 19...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    Java学习笔记(必看经典)

    JAVA的面向对象编程--------课堂笔记 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物皆对象) 所有的事物都有两个方面: 有什么(属性):用来描述对象。 能够做...

    oracle 学习 笔记 实用

    oracle 日常学习的记录…… java调用oracle的存储过程 oracle number(1)一般对应于Java中的类型 Oracle常用函数 oracle触发器new Oracle中自增字段的两种方法 字典表查询

    PL/SQL学习笔记

    (v1 int ,v2 int)--存储过程的参数列表 as --声明局部变量 begin null; end; 调用过程 1.declare调用 2.命令调用 删除存储过程:drop procedure p1; 学习状态:学一个东西,有欲望,写东西出来 三段式:被动,自发...

    net学习笔记及其他代码应用

    9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text....

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    Mysql的学习笔记01

    比如mysql的Java的JDBC驱动程序——mysql-connector-java-5.1.26-bin.jar。再比如.net平台的操作数据库的规范ADO。 模块2:连接池,Mysql自身有个连接池,为了连接线程的复用,Mysql将其进行了池化。将连接资源进行...

    c#学习笔记——学习心得

    名称空间:类似java中的包 集合: 代表: 访问修饰符:private、public、protected、internal:局部的 readonly:只读修饰符 new(新的)、static(静态的)、virtual(虚拟的)、override()、sealed(密封的)、abstranct...

    积分管理系统java源码-iCloudDo::sun:小剑Javaの学习:cloud:整理笔记:red_heart:Backstage-end-learning-to-organiz

    :sun:小剑Javaの学习:cloud:整理笔记:red_heart: Backstage-end-learning-to-organize-notes ###springcloud alibaba 系列: nacos:注册中心(服务注册/发现),配置中心(动态配置管理) 原fescar --&gt; seata ...

    java连接sqoop源码-aws-big-data-cert:AWS大数据专业认证学习笔记

    java连接sqoop源码AWS 大数据专业证书研究 免责声明:本指南是我学习的尾声,因此并不完整,主要集中在琐事/问题上。 取自 . 数据采集 服务说明 200 毫秒延迟(1 个标准消费者),70 毫秒,增强型扇出 HTTP2 推送...

    vs没报错leetcode报错-JavaDataStructure_Algorithm:这个repo包含我目前正在学习的java笔记和leet

    每周学习的数据结构和算法的概念和理论,以及java方法,核心java都在每周学习总结下有详细的介绍。 目录 Bitwise Operation Recursion 按位运算 Java 数据类型有符号两个补码 按位运算符 按位运算符 象征 和 & 或者 ...

    java8rt.jar源码-JVM:学习JVM

    方法从调用到执行完成的过程中,就对应这一个栈帧在虚拟机中入栈到出栈的过程。 局部变量表:存放了编译器可知的8大基本类型和应用类型,其中Long和double是64位的,会占用两个局部变量空间,其余的数据类型只会占用...

    javascript学习笔记之函数定义

    声明式的函数并不会马上执行,需要我们调用才会执行:funname();  * 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句,所以不以分号结束。 函数表达式 var x = function( 参数 ){  ...执行...

    springboot课堂笔记 (源码+数据库)090912

    在开发中我们需要将一 些简单的类型数据保存在本地,因此我们使用 SharedPreferences,它是一种 采用键值对存储的轻量级的数据存储方式。 主页面本界面本着功能性强、操作性简便、易用性较好等几个方面设计的,使使...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    java线程池概念.txt

    workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择   ArrayBlockingQueue;  LinkedBlockingQueue;  ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ │ 深入理解Java内存模型.pdf │ │ │ └─课后资料 │ ├─笔记 │ │ 淘淘商城_day20_课堂笔记.docx │ │ │ └─视频 │ 07-使用Jedis连接集群操作.avi │ 00-今日大纲.avi │ 01-RDB持久化方式.avi │ 02...

Global site tag (gtag.js) - Google Analytics