2013-05-09 60 views
-1

我需要关于如何使用EclipseLink在匿名plsql中检索变量的值的指导。下面我留下一个示例查询。我知道我可以使用函数和存储过程,但是对数据库有一些限制。如何使用eclipselink返回匿名pl sql中的值

DataReadQuery query = new DataReadQuery(); 
SQLCall sqlCall = new SQLCall(); 
StringBuilder plsql = new StringBuilder(); 

plsql.append("DECLARE "); 
plsql.append("\n"); 
plsql.append("out_variable "); 
plsql.append("foo.bar"); 
plsql.append("."); 
plsql.append("number_field"); 
plsql.append("%TYPE;"); 
plsql.append("\n"); 
plsql.append("BEGIN "); 
plsql.append("\n"); 
plsql.append("UPDATE "); 
plsql.append("number_field"); 
plsql.append(" SET number_field = (number_field+1)"); 
plsql.append(" WHERE "); 
plsql.append(" key_field = "); 
plsql.append(Key); 
plsql.append(" "); 
plsql.append(" RETURNING "); 
plsql.append(" number_field "); 
plsql.append(" INTO "); 
plsql.append(" out_variable ; "); 
plsql.append("\n"); 
plsql.append("END; \n"); 

sqlCall.setQueryString(plsql.toString()); 
sqlCall.setQuery(query); 
query.setCall(sqlCall); 

Session session = 
JpaHelper.getEntityManager(getEntityManager()).getActiveSession(); 
Object queryResult = session.executeQuery(query); 
+1

我不认为这是可能的匿名块返回任何东西。通常情况下,如果你想返回一个值,你会使用一个函数。是否有理由必须在匿名块中执行代码而不是两条语句? – FrustratedWithFormsDesigner 2013-05-09 19:29:02

+0

你可以使用键和输出值的绑定参数,并取消匿名块吗?例如。 'UPDATE SOME_TABLE SET NUMBER_FIELD = NUM​​BER_FIELD + 1 WHERE KEY_FIELD =:key_field_param RETURNING NUMBER_FIELD INTO:number_field_param'? – 2013-05-10 15:14:46

+0

是的!但是使用Oracle PL/SQL。 – 2013-05-28 16:37:12

回答

0

感谢您的帮助。不过,我找到了解决问题的办法。

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.Types; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.sql.DataSource; 

public class FetchNumberField { 

    public Integer getNext(){ 

    Integer result = null;  
    Connection connection = null; 
    CallableStatement cs = null; 
    Context context = null; 

    try{ 

     StringBuilder plsql = new StringBuilder(); 
     plsql.append("BEGIN "); 
     plsql.append("\n"); 
     plsql.append(" UPDATE "); 
     plsql.append(DataBaseUtils.SCHEMA + "." + DataBaseUtils.TABLE_NAME); 
     plsql.append(" SET NUMBER_FIELD = (NUMBER_FIELD+1) "); 
     plsql.append(" WHERE "); 
     plsql.append(" NUMBER_FIELD = "); 
     plsql.append(numerField); 
     plsql.append(" "); 
     plsql.append(" RETURNING "); 
     plsql.append(" NUMBER_FIELD "); 
     plsql.append(" INTO "); 
     plsql.append(" ? ; "); 
     plsql.append("\n"); 
     plsql.append("END; \n"); 

     context = new InitialContext(); 
     DataSource dt = (DataSource)context.lookup("java:/jndi/foobar"); 
     connection = dt.getConnection(); 
     cs = connection.prepareCall(plsql.toString()); 
     cs.registerOutParameter(1,Types.INTEGER); 
     cs.execute(); 
     result = (Integer)cs.getObject(1); 

    }catch(Exception ex){ 
     ex.printStackTrace(); 

    }finally{ 
     if(cs != null){ 
      try{ 
       cs.close(); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
      } 
     } 
     if(connection != null){ 
      try{ 
       connection.close(); 
      }catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
     if(context != null){ 
      try{ 
       context.close(); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
      } 
     } 
    } 

    return result; 
} 
}