【问题标题】:Errors is appear during to try query to strored procedure (stored function) with Oracle + Spring Data Jpa尝试使用 Oracle + Spring Data Jpa 查询存储过程(存储函数)时出现错误
【发布时间】:2020-07-08 09:09:18
【问题描述】:

我有创建存储函数的脚本。


CREATE OR REPLACE TYPE OBJ_EMPL AS OBJECT
(
employeeID NUMBER(19,0),
address  VARCHAR2(100 CHAR),
first_Name    VARCHAR2(50 CHAR),
last_Name    VARCHAR2(50 CHAR)

);


CREATE OR REPLACE TYPE LIST_OBJ_EMPL IS TABLE OF OBJ_EMPL;

CREATE OR REPLACE FUNCTION GET_ALL_EMPLOYEES RETURN LIST_OBJ_EMPL IS

varObjEmpl LIST_OBJ_EMPL;


BEGIN
   SELECT OBJ_EMPL ( 
   employeeID,
   first_Name,
   last_Name,
   address
   )

        BULK COLLECT INTO varObjEmpl
        FROM EMPLOYEES; 

   RETURN varObjEmpl;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       return NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END GET_ALL_EMPLOYEES;
/


--SELECT * FROM TABLE(getListEmployees);



/*

CREATE TABLE EMPLOYEES
   (EMPLOYEEID NUMBER(19,0) NOT NULL ENABLE,
    ADDRESS VARCHAR2(100 CHAR),
    FIRST_NAME VARCHAR2(50 CHAR),
    LAST_NAME VARCHAR2(50 CHAR),
    CONSTRAINT PK_EMPLOYEEID PRIMARY KEY (EMPLOYEEID)
     );

     */

  • 实体
@Entity
@Table(name = "employees")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "getListEmployees",
                procedureName = "get_all_employees",
                resultClasses = Employee.class)
})
public class Employee {

    @Id
    @SequenceGenerator(name = "jpaSequence.Employee",
            sequenceName = "SEQUENCE_EMPLOYEE",
            allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jpaSequence.Employee")
    @Column(name = "employeeID")
    private Long employeeID;

    @Column(name = "first_Name")
    @Size(message = "Field 'firstName' can't be более {} ",max = 50)
    private String firstName;

    @Column(name = "last_Name")
    @Size(message = "Field 'firstName' can't be более {} ",max = 50)
    private String lastName;

    @Column(name = "address")
    @Size(message = "Field 'firstName' can't be более {} ",max = 100)
    private String address;

    public Employee() {
    }

  • 存储库
public interface EmployeesRepository
        extends CrudRepository<Employee, Long>,
        EmployeesRepositoryCustom {
}
public interface EmployeesRepositoryCustom {
    List<Employee> getAllEmployees();
}
@Repository
public class EmployeesRepositoryImpl implements EmployeesRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<Employee> getAllEmployees() {

        StoredProcedureQuery getAllEmployees =
                entityManager.createNamedStoredProcedureQuery("getListEmployees");

        return getAllEmployees.getResultList();
    }
}

当我尝试获取数据时出现异常。

调用 CallableStatement.getMoreResults 时出错; SQL [get_all_employees];嵌套异常是 org.hibernate.exception.SQLGrammarException:调用错误 CallableStatement.getMoreResults

java.sql.SQLException:ORA-06550:第 1 行,第 7 列:PLS-00221: 'GET_ALL_EMPLOYEES' 不是过程或未定义 ORA-06550: 第 1 行第 7 列:PL/SQL:语句被忽略

也许您不能使用 @NamedStoredProcedureQuery 注释来处理存储函数? 我不知道该怎么办。谁有什么想法?

【问题讨论】:

  • GET_ALL_EMPLOYEES 未定义...您的过程称为GETLISTEMPLOYEES ?您在其他地方也使用了不一致的名称,这充其量是令人困惑的。
  • 您是否尝试过并通过登录数据源使用的相同用户/密码在 plsql 工具中调用相同的过程?
  • 是的,我从 oracle 控制台尝试过。用户名和密码相同。
  • Alex Poole,我展示的 sql 脚本很旧。我调整了代码。我从代码中做出了正确的调用。

标签: java spring-boot oracle11g spring-data-jpa


【解决方案1】:

解决方案

public interface EmployeesRepository
        extends CrudRepository<Employee, Long>,
        EmployeesRepositoryCustom {

    String query = "select * from table (get_all_employees)";

    @Query(nativeQuery = true, value = query)
    Iterable<Employee> findAllEmployees();

}

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多