对于使用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个例子,相信大家对调用存储过程有了一个基本的认知,当然可能大家有各自不同调用存储过程的好的方法,希望大家能共同分享,共同进步。^_^
阅读(1103) | 评论(0) | 转发(0) |