要调用存储过程,我们可以通过 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
结果打印 ****************<BR>");
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
结果打
印 ****************<BR>");
out.append("返回值(人员姓名)为:"+ result+ "<BR>"); 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()+
"<BR>");
}
}
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+
"<BR>");
}
}
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
personid=@pid;
end
create
procedure
getonepart
as
begin
select personid ,personname
from person ;
end
create
procedure
getAllperson
as
begin
select * from person
;
end
相关文章
- 12-10SQL存储过程基于字段名传入的字符串拼接.
- 12-10sqlserver存储过程创建和java调用
- 12-10MyBatis的学习总结:调用存储过程【参考】
- 12-10Spark Graphx Pregel(pregel参数详解,pregel调用实现过程的详细解释)
- 12-10sqlserver存储过程中调用存储过程
- 12-10【SqlServer存储过程(二维数组参数)调用】
- 12-10hibernate 调用存储过程返回参数
- 12-10如何导出存储过程、函数、包和触发器的定义语句?如何导出表和索引的创建语句?...
- 12-10SQL 存储过程里调用另一个存储过程
- 12-10Dynamics CRM - 使用 C# Plugin 调用 SQL 存储过程