【发布时间】: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