Как вызвать хранимую процедуру Oracle с несколькими выходными параметрами — пример Refcursor и Number?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как вызвать хранимую процедуру Oracle с несколькими выходными параметрами — пример Refcursor и Number?

Сообщение Anonymous »

У меня возникла проблема при вызове хранимой процедуры в Spring JPA с использованием @NamedStoredProcedureQuery. Моя хранимая процедура вернет несколько параметров, включая REF_CURSOR и NUMBER (например, REF_CURSOR предназначен для набора результатов, а число — для возврата общего количества записей).
Поэтому мой код такой — мой класс сущности:

Код: Выделить всё

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@IdClass(PowerSellDataId.class)
@NamedStoredProcedureQuery(
name = "PowerSellData.getPowerData",
procedureName = "PKG_DUBAOTHUONGPHAMCMIS.GET_THUONGPHAM",
//resultClasses = PowerSellData.class,
//resultClasses = {PowerSellData.class},
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_MADVIQLY", type = String.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_THANG", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_NAM", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_LOAIDULIEU", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_SOKY", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_LOAIKH", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_PAGE_NUMBER", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "P_PAGE_SIZE", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name = "P_RST", type = void.class),
//@StoredProcedureParameter(mode = ParameterMode.OUT, name = "P_RST", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "P_TOTAL_RECORDS", type = Integer.class)

})
public class PowerSellData  {

@Id
@Column(name = "MA_DVIQLY")
String maDviqly;

@Id
@Column(name = "MA_KHANG")
String maKhang;

@Column(name = "TEN_KHANG")
String tenKhang;

@Column(name = "MANHOM_KHANG")
String maNhomKhang;

@Column(name = "CSUAT")
Integer congSuat;

@Column(name = "THUONG_PHAM")
Integer thuongPham;

@Column(name = "ROW_NUM")
Integer rowNum;
}
Мой класс репозитория:

Код: Выделить всё

package tripqm.evn.java.power.repository;

import java.util.List;
import java.util.Map;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import tripqm.evn.java.power.entity.PowerSellData;

@Repository
public interface PowerRepository extends JpaRepository
 {
@Procedure(name = "PowerSellData.getPowerData")
// List getPowerData
Map getPowerData(
@Param("P_MADVIQLY") String madviqly,
@Param("P_THANG") int thang,
@Param("P_NAM") int nam,
@Param("P_LOAIDULIEU") int loaiDulieu,
@Param("P_SOKY") int soKy,
@Param("P_LOAIKH") int loaiKh,
@Param("P_PAGE_NUMBER") int page,
@Param("P_PAGE_SIZE") int size);
}
Мой класс обслуживания:

Код: Выделить всё

@Service
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@Slf4j
public class PowerDataService {
PowerRepository powerRepository;
PowerDataMapper powerDataMapper;

@Transactional(readOnly = true)
public PaginationResponse
 getSellPowerData(
String madviqly, int thang, int nam, int loaiDulieu, int soKy, int loaiKh, int page, int size) {
//List
Map  sellPowerData = null;
int totalRecords = 0;
int totalPages = 0;
try {
sellPowerData =
powerRepository.getPowerData(madviqly, thang, nam, loaiDulieu, soKy, loaiKh, page, size);
//.get("P_RST");
totalPages = totalRecords / size;
} catch (Exception e) {
e.printStackTrace(); // Prints full stack trace
throw new RuntimeException("Error fetching data from repository: " + e.getMessage(), e);
}
List listPowerData = Arrays.asList(sellPowerData);
//        var result = listPowerData.stream()
//                .map(powerDataMapper::toPowerSellDataResponse)
//                .toList();
return PaginationResponse.builder()
.currentPage(page)
.pageSize(0)
.totalPages(totalPages)
.totalElements(totalRecords)
.data((List)listPowerData)
.build();
}
}
Я применяю точно так же, как документ на веб-сайте Spring JPA: https://docs.spring.io/spring-data/jpa/ ... dures.html
p>
Пример 7: определения метаданных хранимой процедуры для объекта:

Код: Выделить всё

 @Entity
@NamedStoredProcedureQuery(name = "User.multiple_out_parameters", procedureName = "multiple_out_parameters", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name = "some_cursor", type = void.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public class User {}
Пример 8: возврат нескольких параметров OUT:

Код: Выделить всё

@Procedure(name = "User.multiple_out_parameters")
Map returnsMultipleOutParameters(@Param("arg") Integer arg);
Но выдает такую ​​ошибку:

org.springframework.dao.IncorrectResultSizeDataAccessException: вызов хранимой процедуры [PKG_DUBAOTHUONGPHAMCMIS] .GET_THUONGPHAM] вернул несколько результатов

Кто-нибудь может мне помочь, я буду благодарен, потому что я нигде не могу найти ответ в интернете.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -refcursor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»