Как вызвать хранимую процедуру из спящего режима с параметрами IN и OUT
Я хочу вызвать Хранимую процедуру из Hibernate, которая возвращает значение out. Вот моя хранимая процедура.
create procedure myProcedure
(
in in_Id int,
out out_Id int
)
begin
...
END;
Я пытаюсь это вызвать мою процедуру
Query query = session.createSQLQuery(
"CALL myProcedure(:in_Id)")
.setParameter("in_id", 123);
//Not sure how to register out parameters...??
List result = query.list();
Я пробовал все, но не повезло. Не могли бы вы мне помочь?
Если я попробую выше, он говорит:
Неправильное количество аргументов для ПРОЦЕДУРЫ myProcedure; ожидаемый 2, получил 1
Я попытался добавить параметр out, например
myProcedure(:out_id:in_Id)
но затем он говорит
Не все именованные параметры установлены:
Я не знаю, как будет установлен параметр out? Это похоже на следующее?
.setParameter("out_id", ?);
Любая помощь приветствуется:)
Ответы
Ответ 1
Самый простой способ сделать это - вернуть параметр out как часть возвращаемых параметров
(имеет значение только в том случае, если у вас есть доступ к процедурам магазина).
jest добавить процедуру хранения, как показано ниже.
create procedure myProcedure_only_in_parms (
in in_Id int)
begin
call myProcedure(in_id,@out_Id) ;
select @out_id
END;
после того, как это сделано, достаточно просто использовать его с Hibernet следующим образом
Query query = session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();
Результат содержит параметр out,
если вы хотите, чтобы возвращаемые множимые параметры вы могли добавить, выполнив
выберите @parm1, @parm2,..., @parmn
Надеюсь, что это помогло
Ответ 2
Я написал очень подробную статью о о том, как вы можете вызывать MySQL хранимые процедуры и функции базы данных из Hibernate, но я напишу короткую здесь также.
Учитывая, что у вас есть простая хранимая процедура, которая выводит базовый тип:
CREATE PROCEDURE count_comments (
IN postId INT,
OUT commentCount INT
)
BEGIN
SELECT COUNT(*) INTO commentCount
FROM post_comment
WHERE post_comment.post_id = postId;
END
Вы можете вызвать эту хранимую процедуру с помощью JPA StoredProcedureQuery
:
StoredProcedureQuery query = entityManager
.createStoredProcedureQuery("count_comments")
.registerStoredProcedureParameter(
"postId", Long.class, ParameterMode.IN)
.registerStoredProcedureParameter(
"commentCount", Long.class, ParameterMode.OUT)
.setParameter("postId", 1L);
query.execute();
Long commentCount = (Long) query
.getOutputParameterValue("commentCount");
Ответ 3
Пример:
Session session = em.unwrap(Session.class);
session.setHibernateFlushMode(FlushMode.MANUAL);
ProcedureCall query = session.createStoredProcedureCall("dbo.sp_getorderlistbyparam",BasicResult.class);
query.registerParameter("search_text",String.class, ParameterMode.IN).bindValue(searchText);
query.registerParameter("membership_nbr",String.class,
query.registerParameter("is_debug",Integer.class, ParameterMode.IN).bindValue(0);
query.registerParameter("result_count",Integer.class, ParameterMode.OUT);
basicResults = (List<BasicResult>) query.getResultList();
ProcedureOutputs procedureOutputs = query.getOutputs();
parameterMap.put("totalOrderCnt" ,(Integer) procedureOutputs.getOutputParameterValue("result_count"));
Ответ 4
@PersistenceContext
private EntityManager entitymanager;
@Override
public String function(int id, int emp_id, String letype, String days, Date fromdate, Date todate, String reason,
String backup, int user_id) {
//Session session = entitymanager.unwrap(Session.class);
StoredProcedureQuery applyLeave = entitymanager.createStoredProcedureQuery("sp_apply_leave");
applyLeave.registerStoredProcedureParameter("p_id", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_emp_id", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_letype", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_days", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_fmdate", Date.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_todate", Date.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_reason", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_backper", String.class, ParameterMode.IN)
.registerStoredProcedureParameter("p_user_id", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("error_msg", String.class, ParameterMode.INOUT);
applyLeave.setParameter("p_id", id);
applyLeave.setParameter("p_emp_id" , emp_id);
applyLeave.setParameter("p_letype" , letype);
applyLeave.setParameter("p_days" , days);
applyLeave.setParameter("p_fmdate" , fromdate);
applyLeave.setParameter("p_todate" , todate);
applyLeave.setParameter("p_reason" , reason);
applyLeave.setParameter("p_backper" , backup);
applyLeave.setParameter("p_user_id" , user_id);
applyLeave.setParameter("error_msg", new String("error_msg"));
//applyLeave.executeUpdate();
String error_msg = (String) applyLeave.getOutputParameterValue("error_msg");
return error_msg;
}
здесь у меня есть автонастройка entitymanager и настроенный постоянный режим гибернации в пакете конфигурации
Ответ 5
@Override
public String generateVoucherNumber(ExpenseHeaderDTO expenseHeaderDTO) {
Session session = sessionFactory.getCurrentSession();
ProcedureCall query = session.createStoredProcedureCall("voucher_number");
query.registerParameter(
"module", String.class, ParameterMode.IN).bindValue("EMPLOYEE_EXPENSE");
query.registerParameter(
"voucherNumber", String.class, ParameterMode.OUT);
ProcedureOutputs procedureResult=query.getOutputs();
String voucherNumber= (String) procedureResult.getOutputParameterValue("voucherNumber");
return voucherNumber;
}
См. выше пример
Ответ 6
just cal normal way but store response out param
in Object[] and we can also get multiple response value in Onject[]
Object[] respnseCode = (Object[])session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();
sysout("out_Id"+respnseCode[0]);
Ответ 7
ResultSet rs1 = null;
ArrayList<Lookup_master> list=new ArrayList<Lookup_master>();
CallableStatement cStmt;
try {
cStmt = hibernateConfiguration.dataSource().getConnection()
.prepareCall("{call SP_ADVSER_LOOKUPMASTER(?,?,?,?,?,?,?)}");
cStmt.setString(1,lookup_master.getLookup_code());
cStmt.setString(2,lookup_master.getLookup_type());
cStmt.setString(3,lookup_master.getLookup_name());
cStmt.setString(4,lookup_master.getMeaning());
cStmt.setString(5,request.getParameter("start_date"));
cStmt.setString(6,request.getParameter("end_date"));
cStmt.registerOutParameter(7, OracleTypes.CURSOR);
cStmt.executeQuery();
rs1 = (ResultSet) cStmt.getObject(7);
while (rs1.next()) {
Lookup_master lookup_master1=new Lookup_master();
lookup_master1.setLookup_id(rs1.getInt(1));
lookup_master1.setLookup_code(rs1.getString(2));
lookup_master1.setLookup_type(rs1.getString(3));
lookup_master1.setLookup_name(rs1.getString(4));
lookup_master1.setMeaning(rs1.getString(5));
lookup_master1.setStart_date(rs1.getDate(6));
lookup_master1.setEnd_date(rs1.getDate(7));
list.add(lookup_master1);
System.out.println(lookup_master1.getLookup_id());
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}