@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class, name = "oRetCsr"),
这是 Oracle 存储过程。因此,您可以在 Toad 或 PL/SQL 查询运行中运行它并查看结果集中的所有输出列。然后在结果集中使用这些列名
示例有 System.out.println (rset.getString ("ENAME"));从光标获取 ENAME
所以映射你的 in 类型 Out 类型参数并检查数据的 refcursor,你可以从 columname 获取数据。
如何将参数传递给 PL/SQL 中的过程和函数?
在 PL/SQL 中,我们可以通过三种方式将参数传递给过程和函数。
1) IN 类型参数:这些类型的参数用于向存储过程发送值。
2) OUT 类型参数:这些类型的参数用于从存储过程中获取值。这类似于函数中的返回类型。
3) IN OUT 参数:这些类型的参数用于发送值和从存储过程中获取值。
当您在 toad 中运行时,您应该能够创建输出类
包演示;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;
@NamedStoredProcedureQueries({ //
@NamedStoredProcedureQuery(name = "Role.findRolesViaProcedure", procedureName = "collect_roles",
resultClasses = Role.class, parameters = { //
@StoredProcedureParameter(name = "role_list_o", mode = ParameterMode.REF_CURSOR, type = void.class) }) //
})
@Entity
public class Role {
@Id @GeneratedValue//
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
RoleRepository.java
package demo;
import java.io.Serializable;
import java.util.List;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.CrudRepository;
interface RoleRepository extends CrudRepository<Role, Serializable> {
@Procedure
List<Role> findRolesViaProcedure();
}
schema.sql
CREATE TABLE "ROLE"
( "ID" NUMBER(10,0),
"NAME" VARCHAR2(255 CHAR)
);
Insert into TRAINING.ROLE (ID,NAME) values ('1','A');
Insert into TRAINING.ROLE (ID,NAME) values ('2','B');
Insert into TRAINING.ROLE (ID,NAME) values ('3','C');
CREATE or replace PROCEDURE collect_roles (role_list_o OUT SYS_REFCURSOR) AS
BEGIN
OPEN role_list_o FOR SELECT id, name FROM role;
END;
SpringDataJpaBugDatajpa652Application.java
package demo;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
@SpringBootApplication
public class SpringDataJpaBugDatajpa652Application {
public static void main(String[] args) {
SpringApplication.run(SpringDataJpaBugDatajpa652Application.class, args);
}
@Bean
public EntityManagerFactory entityManagerFactory(LocalContainerEntityManagerFactoryBean bean) {
return bean.getObject();
}
@Bean
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
bean.setLoadTimeWeaver(new org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver());
bean.setDataSource(dataSource);
EclipseLinkJpaVendorAdapter jva = new EclipseLinkJpaVendorAdapter();
jva.setDatabase(Database.ORACLE);
jva.setShowSql(true);
bean.setJpaVendorAdapter(jva);
return bean;
}
}
SpringDataJpaBugDatajpa652ApplicationTests.java
package demo;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringDataJpaBugDatajpa652Application.class)
public class SpringDataJpaBugDatajpa652ApplicationTests {
@Autowired DataSource dataSource;
@Autowired RoleRepository roleRepository;
@Test
public void contextLoads() {
System.out.println(dataSource);
List<Role> roles = roleRepository.findRolesViaProcedure();
System.out.println(roles);
}
}
https://gist.github.com/thomasdarimont/129bc15d0ccc459610c2