鹰翔宇空

学习和生活

BlogJava 首页 新随笔 联系 聚合 管理
  108 Posts :: 141 Stories :: 221 Comments :: 1 Trackbacks

这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。

一:无返回值的存储过程

存储过程为:

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_IDI_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参数了。

三:返回列表

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

      }

    }

  }

}

在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。

如果有什么问题呢,可以和我联系hnlyhyq@163.com;qq:77542728.

我的心愿,愿中国的程序员早日达到世界水平,领先世界科技。

posted on 2005-12-13 11:05 TrampEagle 阅读(19823) 评论(60)  编辑  收藏 所属分类: 学习体会

Feedback

# re: 用java调用oracle存储过程总结 2005-12-26 17:35 江波
谢谢,,  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2005-12-26 17:36 江波
你能不能加我,,,我们共同学习哈。。
42401916  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2005-12-28 08:28 TrampEagle
这本就是个相互交流学习的平台,所以不用客气的。你当然可以成为我的好友的,共同学习,共同努力!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-01-09 09:36 张伟
收益良多,十分感谢;希望能成为好友,共同学习进步!qq:349477837  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-01-10 14:02 ice
垃圾代码
中国怎么有这么多的垃圾程序员,去死吧 还希望早日达到世界水平 笑话!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-01-10 14:29 TrampEagle
TO ice:
首先向你致歉,可能这些代码没有使你能够如愿正常进行你的工作;
其次,我想声明一点,这里的代码只是介绍一种方法,提供一种途径,我的本意是为自己做笔记的,其次才是能不能为他人做点贡献,所以有的地方可能不太完善,为自己的做法致歉。
但是,通过谩骂就能解决问题吗?既然这方面,我们存在沟壑,我们就应该好好沟通一下,对你我想也不会有坏处的。如果你有什么问题,可以通过我的联系方式同我联系!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-01-12 11:43 ryan
我也研究Java调Oracle Store Procedure一段时间,发现一些问题
主要是Open 的Cursor不会释放,v$open_cursor只增长不减少,最后服务器只能重起。
希望能交流。QQ:22828569  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-03-10 16:41 Janson
你的文章发布的真是太好了!我找这方面的例子已经一个星期了,终于在你这能够执行了,呵呵,从此我也可以练习使用oracle的存储过程了。哥们,真的谢了!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-03-10 21:51 TrampEagle
@Janson
能帮上你的小忙是我万分的荣幸,呵呵!
其实,我学习存储过程时,就是因为找不到这方面的完整例子花费了不少时间,所以记于此,一是作笔记,另外给需要这方面知识的朋友提供一份参考,使他们少走一些弯路。
希望大家都能把自己的一些心得体会发布出来,互相帮助,共同进步!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-03-28 14:39 ajian005
可以少走弯路 , 谢谢 !  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-05-29 18:13 TrampEagle
补充一个使用oracle存储过程分页的小例子:
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,lowerNum in numeric,higherNum in numeric) is
begin
OPEN p_CURSOR FOR select * from ( select row_.*, rownum rownum_ from (select id,title,status from HYQTEST) row_ where rownum <= higherNum) where rownum_ >lowerNum;
end TESTC;

使用plsql测试:
declare
lowerNum integer;
higherNum integer;
id varchar2(10);
title varchar2(500);
status numeric;
c testpackage.Test_CURSOR;
rownum_ integer;
begin
lowerNum:=1;
higherNum:=10;
TESTC(c,lowerNum,higherNum);
LOOP
FETCH c INTO id,title,status,rownum_;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('=行号='||rownum_||'=='||id||'==='||title||'===='||status||'==');
END LOOP;
CLOSE c;

end;

  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-07-12 13:18 yclc
似乎使用cStmt.getResultSet() 可以直接获取procedure中执行过的select  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-08-09 09:43 wu
呵呵~我也找了挺长时间了,正好用上,谢谢 a lot 了哈哈。  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-08-14 10:43 才子
谢谢你了,大哥  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-08-23 17:25 不断学习是责任
谢谢了,受益不少.  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-09-29 17:13 coldiced
谢谢帮助,支持楼主!鄙视牛人!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-10-31 19:46 zdl
应该好好学习,支持下楼主  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-11-25 11:02
顶一下  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-12-14 11:44 ipxzerg
样例的技术含量和代码的水平有待提高,不过还是支持一下,希望楼主加强学习。  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2006-12-23 23:37 vally
太感谢了,正急需这俩方面的信息,今天一找就给全部找到了!希望楼主能多发布些好资料呀!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-02-14 14:07 在线视频
不错,3种情况都介绍了  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-03-30 13:34 fdfd
dffdfddff  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-03-30 14:11 aa
中国程序员什么 时候才到世界水平呢?难,少  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-04-27 14:16 sd
加油  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-05-10 15:28 Laurence.Lee
up!
up!
Thanks a lot!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-05-22 11:54 ade
谢谢分享!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-06-04 11:28 学习ing
顶以下  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-07-13 11:24 huraky
谢谢楼主,收益不少!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-07-17 17:24 zbc
真的写得很好..
是个学习的好例子.  回复  更多评论
  

# re: 用java调用oracle存储过程总结[未登录] 2007-07-22 00:43
非常感谢楼主,我找这样的例子找了好久,我原来用sqlserver,现转oracle,两者差别太大,在sqlserver中轻松能搞定的存储过程在oracle中有点束手无册了,查了很多资料,也没搞明白,看了你的例子,受益非浅,可以加你的QQ不,我的QQ:663535631

  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-08-14 16:35 bai
总结得很好
顶!!!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-08-26 18:16 可可
不错啊  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-09-07 14:33 little star
特别鄙视哪个说话垃圾的.
我觉得楼主很不错的,把自己做出来的东西跟大家一起分享,虽然这个代码简单了点,但也有很多人看到后受到启发.在国内做东西,每个人的思路都不一样,实现的方式也可能不一样,象你那样说完全没有必要,你觉得不合适你,你可以不看.  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-09-18 13:41 饶志华
谢谢分享  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-10-10 17:49 Roger Gao
数据类型是table,元素类型是Record的存储过程调用过吗?  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2007-11-10 16:26 123
能用存储过程操作文件吗 能用oracle调用java程序删除文件吗 有的话 请说出来 共同研究 你的文章很有用   回复  更多评论
  

# re: 用java调用oracle存储过程总结[未登录] 2007-12-28 16:52 jedi
多谢,转到偶的BLOG上收藏了  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-03-18 19:45 gma
@ice
你写一个不垃圾的给瞧瞧!  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-03-24 11:39 Irene
正好我也要学习存储过程,感谢lz  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-03-31 11:59 hao
我刚开始学存储过程,多谢啦!  回复  更多评论
  

# re: 用java调用oracle存储过程总结[未登录] 2008-04-01 09:47 aa
你他妈的狗屎,不要乱说别人的代码不好,有本领把你写的share出来,自己写不出吗还说别人是垃圾,我看你才是垃圾中的极品  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-04-16 21:28 yangyi
你写的太好了
能否加我啊
QQ 465937187  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-04-25 00:00 man
说点题外话,你的文章咬文嚼字的,闲词废话和语病很多,希望你尽量用平实直接的表达方式。  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-05-13 23:05 xlx
谢谢  回复  更多评论
  

# re: 用java调用oracle存储过程总结 2008-05-21 14:39 hello
为什么我按上面做的,数据库表里面没有数据啊  回复