【问题标题】:getting error PLS-00221 is not a procedure or is undefined when calling a stored procedure in springboot jpa repository在springboot jpa存储库中调用存储过程时出现错误PLS-00221不是过程或未定义
【发布时间】:2021-05-11 12:06:31
【问题描述】:

请帮我解决这个问题。我有一个非常简单的 crud 项目,在 springboot 中的 oracle DB(ID,name,age,email) 中有一个学生表,我想知道的是让一个学生在 jpa 存储库中使用一个调用存储过程的方法。运行项目时出现错误 PLS-00221 不是过程或未定义。

--stored procedure
CREATE OR REPLACE FUNCTION
findstudentbyid
RETURN STUDENT%ROWTYPE
IS
estudiante STUDENT%ROWTYPE;
BEGIN
    SELECT * 
    INTO estudiante
    FROM STUDENT
    WHERE ID=1;     
    RETURN estudiante;
END findstudentbyid;
//Entity in sprongboot project
@Entity
@Table

@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
        name = "findstudentbyid",
        procedureName = "findstudentbyid"
    )
})

public class Student {
  
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)

    //Private variables
    
    private Long ID;
    private String name;
    private Number age;
    private String email; 

    //Constructor
    protected Student(){}

    public Student(String name , Number age , String email){        
        this.name = name;
        this.age = age;
        this.email = email;
    }



    public Long getID() {
        return ID;
    }

    public String getName() {
        return name;
    }


    public Number getAge() {
        return age;
    }
 
    
    public String getEmail() {
        return email;
    }

 
       
}
//JPA CRUD REPOSITORY
public interface StudentRepository extends CrudRepository<Student,Long>{
    @Procedure(name = "findstudentbyid")
    Iterable<Student> findstudentbyid();
}

【问题讨论】:

  • 我不了解 Java,但是:我看到您将函数名称括在双引号中(无法判断,也许 Java 期望如此)。在 Oracle 中,对象名称默认为大写,除非以混合大小写创建并用双引号括起来。因为你没有这样做 - 没关系;不要在 Oracle 中使用混合大小写 - 另一种选择是尝试使用大写的函数调用。所以:代替"findstudentbyid",试试"FINDSTUDENTBYID"

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


【解决方案1】:

您创建了一个函数,但没有创建一个存储过程。 这些对象对于 DB 和 JPA 是不同的,请尝试将您的 create function 更改为 create procedure 或将过程的调用更改为函数的调用签名。 此外,有关 JPA 和函数调用的更多信息,请参阅 here

【讨论】:

  • 我认为它会是一样的,因为函数或过程都存储在 oracle 的过程文件夹中。我已经尝试过使用原生 @query 替代方案,但遇到了同样的错误。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2012-11-24
  • 2018-10-04
  • 2020-12-17
相关资源
最近更新 更多