posts - 42,comments - 83,trackbacks - 0
        很多情况下,在执行数据添加、更新、查询的时候,为了降低应用服务器(比如weblogic)的负荷,我们可以将复杂的数据计算逻辑放在database端,这样可以充分利用database的资源,提高数据计算速度。对于数据查询,我们需要有返回值,那么这些带有返回值的procedure在java上怎么调用呢?
1:首先,我们创建一个简单的数据表,
    create table address(addr varchar2(40));

2:然后我们可以创建一个插入数据的过程(当然也可以直接手工添加),如下,
    create or replace procedure addAddress(addr varchar2) as
    begin
        insert into address values(addr);
    end addAddress;

3: 接下来,我们先创建一个带有In/Out的存储过程,如下,
    create or replace procedure getAddr(inAddr in varchar2, outAddr out varchar2) as
    begin
        select addr into outAddr from address where addr=inAddr;
    end getAddr;
这个存储过程可以在SQLPlus中以如下的方式调用,
    DECLARE
           TMP varchar2(40);
    BEGIN
           TMP:=1;
           getAddr('test',TMP);
    END ;

4:好了,数据库的东西创建完了,我们现在来看看如何通过Java的CallableStatement去掉用这个过程呢? 代码如下:
 1     public void procTest()
 2     {
 3         try{
 4             Connection conn = getConnection("t3://localhost:7001", NonXA_NotSupportGTX_10);
 5             System.out.println("connections are retrieved!");
 6             CallableStatement stmt = conn.prepareCall("call getAddr(?,?)");
 7             stmt.registerOutParameter(2,java.sql.Types.VARCHAR);
 8             stmt.setString(1"test");
 9             stmt.executeUpdate();
10             String val = stmt.getString(2);
11             System.out.println("val: " + val);
12             conn.close();
13         }catch(Exception e){
14             e.printStackTrace();
15         }
16     }
    这个procedure有两个bind varible,第一个是input参数,第二个为返回值。调用这个过程前,我们首先需要将返回值在callable statement中register,即stmt.registerOutParameter(2,java.sql.Types.VARCHAR); 在执行statement前,我们需要将input参数输入,即stmt.setString(1"test"); callable statement执行后,我们可以通过index来获取返回值了,即String val = stmt.getString(2);

posted on 2009-05-08 13:19 走走停停又三年 阅读(1306) 评论(0)  编辑  收藏 所属分类: Database

只有注册用户登录后才能发表评论。


网站导航: