我正在尝试使用JPA调用存储过程。当我从serviceImpl调用testWithNumber时,它可以正常工作,但是当我调用testWithType时,它会引发错误:
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException:调用错误 CallableStatement.getMoreResults
PLS-00306:调用“ TESTWITHTYPE”时参数的数量或类型错误
有一种方法可以调用具有自定义TYPE参数的存储过程?
同一包(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;
}
}