• 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  结果打印  ****************<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

  • 相关阅读:
    解析Javascript事件冒泡机制
    LeetCode——Flatten Binary Tree to Linked List
    流动python
    HDU2586
    Cannot find ActionMappings or ActionFormBeans collection
    reactor设计模式
    简单的Ajax应用实例
    CString——Left、Right、Find、ReverseFind
    MATLAB新手教程
    八大排序算法总结
  • 原文地址:https://www.cnblogs.com/lbangel/p/3534793.html
Copyright © 2020-2023  润新知