2013-05-09 2 views
-1

Мне нужно руководство по тому, как получить значение переменной в анонимном элементе plsql с помощью EclipseLink. Ниже я оставляю образец запроса. Я знаю, что могу использовать функции и хранимые процедуры, однако существуют ограничения в базе данных.как вернуть значение в анонимный pl sql с помощью eclipselink

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

+0

Можете ли вы использовать связанные параметры для значений ключа и вывода и уничтожить анонимный блок? Например. 'UPDATE SOME_TABLE SET NUMBER_FIELD = NUMBER_FIELD + 1 WHERE KEY_FIELD =: key_field_param RETURNING NUMBER_FIELD INTO: number_field_param'? –

+0

Да! Но с использованием Oracle PL/SQL. –

ответ

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; 
} 
} 
Смежные вопросы