Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3340671
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2007-03-20 13:05:09

对于使用java来调用存储过程,可能对于很多人来说已经再熟悉不过了,但是仍然希望能将自己的东西整理过后,发给大家共享。好了,闲话少说,开始正题。
    有些人认为存储过程的使用会破坏系统的整体结构,因为它实际上把业务逻辑的实现放到了存储层,实际上很多业务系统的一些业务实现是很复杂的,需要频繁的和 数据库交互,如果不用存储过程实现,采用java编码的方式实现,特别是分布式系统中,性能会很差的,实现也很复杂。当然,就维护来说,存储过程显得有些 不太好维护。下面以一个例子做为索引,希望能系统的对存储过程的调用进行一个详细全面的说明,如有不当之处,还希望能得到大家的指正。^_^
        首先解释一下存储过程,存储过程位于数据库服务器中,是由SQL语句和PL/SQL语句组合在一起为执行某个任务的一个可执行单位。
    java提供了访问数据的JDBC API。那么接下来,我们就开始编写访问存储过程的代码。
   
    首先要创建表和对应的存储过程。

    表:
create table userTabel(
   userid number(10),
   username varchar2(100),
   constraint  PK_USERID  PRIMARY KEY(userid) 
);
truncate table userTabel;
commit;

       包和存储过程:


CREATE OR REPLACE package TestPackage AS
  TYPE userCur is REF CURSOR;

  PROCEDURE addUserPro(
userid in userTabel.userId%type,
username in userTabel.username%type) ;

  PROCEDURE getUserPro(result out userCur) ;

END TestPackage ;


CREATE OR REPLACE PACKAGE BODY TestPackage AS
PROCEDURE addUserPro(
uid in userTabel.userId%type,
umamein userTabel.username%type) is
begin
insert into userTabel(userId,username) values(uid ,umame);
end;

CREATE OR REPLACE PACKAGE BODY TestPackage AS PROCEDURE getUserPro(
result out userCur) is
begin
open result for select userid,username from userTabel;
end;

    OK,可以编写具体的代码了。
    代码实现功能:调用addUserPro存储过程,向数据库中的用户表添加一条记录。

    Context context = new InitialContext();

        DataSource ds = (DataSource)context.lookup("OracleDataSource");

        Connection conn = ds.getConnection();

    CallableStatement proc = connection.prepareCall("{ call TestPackage.addUserPro(?, ?) }");

        proc.execute();

        proc.close();

        conn.close();

   
    代码实现功能:调用getUserPro存储过程,获取数据库中的用户信息。
   
    Context context = new InitialContext();

        DataSource ds = (DataSource)context.lookup("OracleDataSource");

        Connection conn = ds.getConnection();

        CallableStatement proc= conn.prepareCall("{ call TestPackage.addUserPro}");

        proc.execute();

       ResultSet  rs = (ResultSet) ctm.getObject(1);

       while (rs.next())
       {
           ...
       }

        rs.close();

        proc.close();

        conn.close();

    通过上面的2个例子,相信大家对调用存储过程有了一个基本的认知,当然可能大家有各自不同调用存储过程的好的方法,希望大家能共同分享,共同进步。^_^
阅读(1061) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~