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

用java调用oracle存储过程总结

阅读更多

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

一:无返回值的存储过程

存储过程为:

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 阅读(66479) 评论(95)  编辑  收藏 所属分类: 学习体会

<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html" dc:identifier="http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html" dc:title="用java调用oracle存储过程总结" trackback:ping="http://www.blogjava.net/TrampEagle/services/trackbacks/23605.aspx" /> </rdf:RDF> -->

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;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics