неверный номер или типы аргументов при вызове Stored Proc - PullRequest
0 голосов
/ 27 апреля 2020

Я звоню в Stored Pro c из JPA данных Spring:

Процедура:

create or replace procedure GET_LATEST_GC (arg1 IN VARCHAR2, res1 OUT VARCHAR2, res2 OUT VARCHAR2)
AS
BEGIN
  DELETE FROM GC_T WHERE id = arg1;

  COMMIT;

  BEGIN
    SELECT gc.NAME, s.SIP INTO res1, res2
    FROM GC_T gc, STAFF_T s WHERE s.id = gc.id 
    AND START_TIME = (SELECT MAX(START_TIME) FROM GC_T);

  EXCEPTION
  WHEN others THEN  
    res1 := '';    
  END;
END;

Код JPA данных Spring *

// Хранилище

 public interface ActiveDao extends JpaRepository<GcT,Integer>  {
        @Procedure(procedureName="GET_LATEST_GC")
        Object[] plus1(@Param("arg1") String arg1);
    }

// Entity

@Data
@Entity
@NamedStoredProcedureQuery(name = "GET_LATEST_GC",
        procedureName = "GET_LATEST_GC", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg1", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res1", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = String.class)})
@Table(schema = "abc", name = "GC_T")
public class GcT implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String name;


}

// Вызов

Object[] activeGCInfo =activeDao.plus1(arg);

Процедура принимает один параметр, и я также передаю 1 аргумент. Затем я также получаю эту ошибку :

Hibernate: {вызов GET_LATEST_G C (?,?)} ОШИБКА ohejdb c .spi.SqlExceptionHelper - ORA-06550: строка 1, столбец 7: \ nPLS-00306: неправильный номер или типы аргументов в вызове 'GET_LATEST_G C' \ nORA-06550: строка 1, столбец 7: \ nPL / SQL: оператор игнорируется \ n

Пожалуйста, дайте мне знать, где я делаю неправильно. Спасибо

Обновление - попытался добавить параметры OUT также в соответствии с предложением

//Repo
 public interface ActiveDao extends JpaRepository<GcT,Integer>  {
            @Procedure(procedureName="GET_LATEST_GC")
            Object[] plus1(@Param("arg1") String arg1,@Param("res1") String res1,@Param("res2") String res2);
        }

//Call
Object[] activeGCInfo =activeDao.plus1(arg,"","");

Я посылаю три аргумента, но он показывает мне 4 аргумента по ошибке:

Hibernate: {call GET_LATEST_G C (?,?,?,?)} SqlExceptionHelper - ORA-06550: строка 1, столбец 7: \ nPLS-00306: неверное число или типы аргументов в вызов 'GET_LATEST_G C' \ nORA-06550: строка 1, столбец 7: \ nPL / SQL: оператор игнорируется \ n

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Попробуйте изменить результат с Object [] на Map<String, Object вместе со ссылкой на имя pro c с name вместо имя_процедуры. На основании ошибки, я не уверен, что это исправит это. Spring Data JPA ожидает Map в качестве возвращаемого значения для нескольких выходных параметров, поэтому каждый выходной параметр можно найти в качестве ключа в этой карте. Но я думаю, что основная ошибка заключается в том, что имя_процедуры отображается непосредственно на БД, но name= будет отображаться на правильную сущность

//Repo
 public interface ActiveDao extends JpaRepository<GcT,Integer>  {
            @Procedure(name="GET_LATEST_GC")
            Map<String, Object> plus1(@Param("arg1") String arg1);
        }

//Call
Map<String, Object> activeGCInfo =activeDao.plus1(arg);
0 голосов
/ 27 апреля 2020

Вот что произошло:

  • вы объявили процедуру с 3 параметрами: 1 вход и 2 выход
  • вы сказали: «Процедура принимает один параметр, и я также передаю 1 аргумент "
    • , который был параметром 1-й процедуры (arg1 IN)
    • , приводит к" PLS-00306: неверное число или типы аргументов "

Конечно, это так; вам нужно предоставить еще 2 аргумента (тип данных должен иметь возможность принимать VARCHAR2 значений, возвращаемых процедурой).

...