Я пытаюсь вызвать хранимую процедуру с помощью JPA. Когда я вызываю testWithNumber из serviceImpl, он работает нормально, но когда я вызываю testWithType, он выдает ошибку:
javax.persistence.PersistenceException:
org.hibernate.exception.SQLGrammarException: ошибка вызова
CallableStatement.getMoreResults
PLS-00306: неверный номер или типы аргументов при вызове 'TESTWITHTYPE'
Есть способ вызвать хранимую процедуру с параметрами пользовательского ТИПА?
Процедуры базы данных внутри одного пакета (PKG_TEST):
PROCEDURE testWithNumber (idName IN NUMBER, nameFound out VARCHAR2)
IS
BEGIN
SELECT NAME INTO nameFound FROM NAMES_TABLE WHERE ID_NAME=idName;
END test;
PROCEDURE testWithType (nameParam IN TEST_TYPE, nameFound out VARCHAR2)
IS
BEGIN
SELECT NAME INTO nameFound FROM NAMES_TABLE WHERE ID_NAME=nameParam.idName;
END test;
TEST_TYPE в базе данных выглядит так:
create or replace TYPE TEST_TYPE FORCE AS OBJECT
(
ID_NAME NUMBER(22)
,
NAME VARCHAR2(100)
);
Реализация сервиса:
@Override
public void testWithType(NameDto nameObject) {
StoredProcedureQuery query = em.createStoredProcedureQuery("PKG_TEST.testWithType")
.registerStoredProcedureParameter(1, NameDto.class, ParameterMode.IN)
.setParameter(1, nameObject)
.registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);
query.execute();
LOG.info(query.getOutputParameterValue(2));
}
@Override
public void testWithNumber(NameDto nameObject) {
StoredProcedureQuery query = em.createStoredProcedureQuery("PKG_TEST.testWithNumber")
.registerStoredProcedureParameter(1, Long.class, ParameterMode.IN)
.setParameter(1, nameObject.getIdName())
.registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);
query.execute();
LOG.info(query.getOutputParameterValue(2));
}
Класс NameDto:
import java.io.Serializable;
import java.util.Date;
public class NameDto {
Long ID_NAME;
String NAME;
public NameDto(Long iD_NAME, String nAME) {
super();
ID_NAME = iD_NAME;
NAME = nAME;
}
public Long getID_NAME() {
return ID_NAME;
}
public void setID_NAME(Long iD_NAME) {
ID_NAME = iD_NAME;
}
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
}