Spring Data Jpa вызывает хранимую процедуру - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь создать метод, который вызывает хранимую процедуру для очень простой вставки и выбора,

Я создал хранимую процедуру в базе данных Oracle, как показано ниже:

CREATE OR REPLACE PROCEDURE schema.insertNewTable(p_test IN VARCHAR2, p_out OUT VARCHAR2)
IS
BEGIN
INSERT INTO NEWTABLE("TEST") VALUES(p_test);
SELECT '1' INTO p_out FROM DUAL;

COMMIT;

END;

Тогда на сущности:

@Procedure(procedureName = "insertNewTable", outputParameterName="p_out")
String insertNewTable(@Param("p_test") String p_test);

но каждый раз, когда я вызываю этот метод, я получаю это:

2018-06-23 20:04:43,047|ORA-06550: row 1, colonna 7:
PLS-00306: wrong number or types of arguments in call to 'INSERTNEWTABLE'
ORA-06550: riga 1, column 7:
PL/SQL: Statement ignored

2018-06-23 20:04:43,100|org.springframework.dao.InvalidDataAccessResourceUsageException: Error calling CallableStatement.getMoreResults; SQL [insertNewTable]; nested exception is org.hibernate.exception.SQLGrammarException: Error calling CallableStatement.getMoreResults
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:261)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:503)

После нескольких попыток (и исключений) я изменил сущность и вызов, чтобы избежать типов «OUT», и, таким образом, у меня нет ошибок:

CREATE OR REPLACE PROCEDURE schema.insertNewTable(p_test IN VARCHAR2)
IS
BEGIN
INSERT INTO NEWTABLE("TEST") VALUES(p_test);

COMMIT;

END;

Затем на сущности:

@Procedure(procedureName = "insertNewTable")
void insertNewTable(@Param("p_test") String p_test);

Как я могу это исправить, чтобы получить возвращаемое значение?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

с пружинными данными

в вашем хранилище:

1) вызов с собственным SQL:

@ Query (value = "выбрать имя-процедуры-магазина (: param) из двойного", nativeQuery = true) BigDecimal имя-метода (@Param ("param") длинный параметр);

2)

@Procedure(procedureName = "store-procedure-name", outputParameterName = "output-param-of-store-procedure")

return-type-of-store-procedure  method-name(input-params-of-store-procedure);
0 голосов
/ 23 июня 2018

вы можете использовать NamedStoredProcedureQuery

@NamedStoredProcedureQuery(
    name = "insertNewTable", 
    procedureName = "insertNewTable", 
    parameters = { 
        @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name 
= "p_test"), 
        @StoredProcedureParameter(mode = ParameterMode.OUT, type = String.class, name 
= "p_out"), 
      )
    }
)

вызов метода:

StoredProcedureQuery query = 
this.em.createNamedStoredProcedureQuery("insertNewTable");
query.setParameter("p_test", ""TEST"");
query.execute();
String out =  query.getOutputParameterValue("p_out");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...