在ejb中调用存储过程调用oracle的存储过程,EJB3 调用的存储过程

要调用存储过程,我们可以通过 EntityManager 对象的 createNativeQuery()方法执行 SQL

语句

(注意:这里说的是SQL 语句,不是 EJB3

QL),

调用存储过程的 SQL 格式如下:

{call

存储过程名称(参数 1,  参数 2, …)}

在 EJB3

中你可以调用的存储过程有两种

1.无返回值的存储过程。

2.返回值为

ResultSet(以 select 形式返回的值)的存储过程,EJB3 不能调用以 OUT

参数返回值的存储过程。

下面我们看看几种具有代表性的存储过程的调用方法.

1

调用无返回值的存储过程

我们首先创建一个名为 AddPerson 的存储过程,他的 DDL

如下(注:本例使用的是Sql2000 数据库):

CREATE PROCEDURE `AddPerson`()

NOT DETERMINISTIC

SQL SECURITY DEFINER COMMENT

‘‘

BEGIN

INSERT into person values(

null,‘存储过程‘,1,25,‘1980‘);

END;

下面的代码片断展示了无返回值存储过程的调用方法:

@PersistenceContext

protected

EntityManager em;

private String

QueryNoneReturnValueStoreProcedure(){

//调用无返回参数的存储过程

Query

query = em.createNativeQuery("{call

AddPerson()}");

query.executeUpdate();

StringBuffer

out = new StringBuffer("*************** QueryNoneReturnValueStoreProcedure

结果打印  ****************
");

return

out.toString();

}

2

调用返回单值的存储过程

我们首先创建一个名为 GetPersonName 的存储过程,他有一个

INTEGER 类型的输入参数,存储过程的 DDL 如 下(注:本例使用的是Sql2000数据库):

CREATE

PROCEDURE `GetPersonName`(IN Pid INTEGER(11)) NOT

DETERMINISTIC

SQL SECURITY DEFINER COMMENT

‘‘

BEGIN

select personname from

person where

`personid`=Pid;

END;

上面的 select

语句不一定要从表中取数据,你也可以这样写:select

‘foshanren’

下面的代码片断展示了返回单值的存储过程的调用方法:

@PersistenceContext

protected EntityManager

em;

private String

QuerySingleObjectStoreProcedure(){

//调用返回单个值的存储过程

Query

query = em.createNativeQuery("{call

GetPersonName(?)}");

query.setParameter(1, new

Integer(1));

String result =

query.getSingleResult().toString();

StringBuffer out = new

StringBuffer("*************** QuerySingleObjectStoreProcedure

结果打

印  ****************
");

out.append("返回值(人员姓名)为:"+ result+ "
"); return

out.toString();

}

3

调用返回表全部列的存储过程

我们首先创建一个名为 GetPersonList 的存储过程,他的 DDL

如下(注:本例使用的是Sql2000数据库):

CREATE PROCEDURE `GetPersonList`()

NOT DETERMINISTIC

SQL SECURITY DEFINER COMMENT

‘‘

BEGIN

select * from

person;

END;

下面的代码片断展示了返回表全部列的存储过程的调用方法,我们可以让

EJB3  Persistence 运行环境将列值直接

填充入一个 Entity

的实例(本例填充进 Person 对象),并将实例作为结果返回.

@PersistenceContext

protected EntityManager

em;

private String

QueryStoreProcedure(){

//调用返回 Person

全部列的存储过程

Query query = em.createNativeQuery("{call

GetPersonList()}", Person.class); List result =

query.getResultList();

StringBuffer out = new

StringBuffer("*************** QueryStoreProcedure

结果打印

****************");

if

(result!=null){

Iterator iterator =

result.iterator();

while( iterator.hasNext()

){

Person person=

(Person)iterator.next();

out.append(person.getName()+

"
");

}

}

return

out.toString();

}

4

调用返回部分列的存储过程

我们首先创建一个名为 GetPersonPartProperties 的存储过程,他的

DDL 如下(注:本例使用的是Sql2000数据库):

CREATE PROCEDURE

`GetPersonPartProperties`() NOT DETERMINISTIC

SQL SECURITY

DEFINER

COMMENT ‘‘ BEGIN

SELECT

personid, personname from

person;

END;

上面的 select

语句不一定要从表中取数据,你也可以这样写:select 3000,

‘foshanren’

下面的代码片断展示了返回部分列的存储过程的调用方法.

@PersistenceContext

protected EntityManager

em;

private String

QueryPartColumnStoreProcedure(){

//调用返回部分列的存储过程

Query

query = em.createNativeQuery("{call GetPersonPartProperties()}"); List result =

query.getResultList();

StringBuffer out = new

StringBuffer("*************** QueryPartColumnStoreProcedure

结果打印

****************");

if

(result!=null){

Iterator iterator =

result.iterator();

while( iterator.hasNext()

){

//取每一行

Object[] row = ( Object[])

iterator.next();

//数组中的第一个值是

personid

int personid =

Integer.parseInt(row[0].toString()); String PersonName =

row[1].toString();

out.append("人员 ID="+ personid+ ";

姓名="+PersonName+

"
");

}

}

return

out.toString();

}

SQL2000的存储过程调用

create

table person(

personid  int primary key

,

personname varchar(10) not

null,

age varchar(10) not null,

sex

varchar(10) not null

)

select * from

person

create procedure

addperson

as

begin

INSERT into person values(

1,‘存储过程‘,1,25);

end

create

procedure getperson

@pid

int

as

begin

select personname from

person where

[email protected];

end

create

procedure

getonepart

as

begin

select personid ,personname

from person ;

end

create

procedure

getAllperson

as

begin

select * from person

;

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值