gpt4 book ai didi

oracle - 如何在 H2 中定义 Oracle Package Procedure 以进行测试

转载 作者:行者123 更新时间:2023-11-28 21:37:12 28 4
gpt4 key购买 nike

我正在测试一个将数据读/写到 Oracle 数据库的 spring boot 应用程序。此 Oracle DB 具有 Oracle 包和这些包中的过程。在某些时候,spring boot 应用程序通过实体存储库调用此过程,如下所示

@Repository
public interface StudentRepository extends JpaRepository<Student, String> {

@Modifying
@Query(value = "begin sch1.STUDENT_PACKAGE.Set_Grades_To_A('A'); end;", nativeQuery = true)
public void setStudentGradeToA();
}

因此,它使用 native 查询来调用 sch1 架构的 STUDENT_PACKAGE 包中的过程 Set_GradesToA

我目前正在测试 Spring Boot 应用程序的功能,不是它与 Oracle 数据库之间的集成。因此,我决定暂时使用内存数据库 (H2)(具有 Oracle 兼容性选项)来替换 Oracle DB。 但是我怎样才能伪造出这些 java 包过程?

我已经尝试在我的 schema.sql(或 data.sql)中创建一个别名,如下所示:

CREATE SCHEMA if not exists sch1;
CREATE ALIAS sch1.STUDENT_PACKAGE AS $$ void Set_Grades_To_A(String s) { new String(s); } $$;

我真的不关心 Set_Grades_To_A 过程中有什么,我关心的是如何定义它。

当我按上述方式创建别名时,我仍然遇到语法错误。

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "BEGIN SCH1[*].STUDENT_PACKAGE.Set_Grades_To_A('A'); END; "; SQL statement:
begin sch1.STUDENT_PACKAGE.Set_Grades_To_A('A'); end; [42000-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.message.DbException.getSyntaxError(DbException.java:203)

我想我有两个问题:

  1. 如何在 sch1 模式中伪造 Oracle 包内的存储过程?

  2. 为什么会出现上述语法错误?

最佳答案

这是我做的。

问题 #2:为了回答这个问题,我必须按如下方式更改 native 查询

@Repository
public interface StudentRepository extends JpaRepository<Student, String> {

@Modifying
@Query(value = "call sch1.STUDENT_PACKAGE.Set_Grades_To_A('A')", nativeQuery = true)
public void setStudentGradeToA();
}

问题 #1:要回答这个问题需要三件事。现在我已经像上面那样更改了 native 查询,但我得到了一个不同的错误:

Caused by: org.h2.jdbc.JdbcSQLException: Database "sch1" not found; SQL statement:
call sch1.STUDENT_PACKAGE.Set_Grades_To_A('A') [90013-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)

它正在寻找一个名为 sch1 的数据库.似乎用于在 H2 中调用存储过程的模式是 database.schema.procedure_name .由于我不关心该过程实际上做了什么,所以我能够通过创建一个名为 sch1 的数据库来伪造它。一个名为 STUDENT_PACKAGE 的模式和过程名称 Set_Grades_To_A

要创建内存数据库,您必须设置以下属性 spring.datasource.urlapplication.properties文件。

  1. 创建 sch1数据库如下spring.datasource.url=jdbc:h2:mem:sch1;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=CREATE SCHEMA IF NOT EXISTS first_schema .注意数据库名称是 sch1

  2. 创建 STUDENT_PACKAGE模式通过添加这个 \\;CREATE SCHEMA IF NOT EXISTS STUDENT_PACKAGEspring.datasource.url 的结尾.这添加了第二个模式,称为 STUDENT_PACKAGE .该属性应如下所示 spring.datasource.url=jdbc:h2:mem:sch1;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=CREATE SCHEMA IF NOT EXISTS first_schema\\;CREATE SCHEMA IF NOT EXISTS STUDENT_PACKAGE

  3. 创建 Set_Grades_To_A存储过程,将其添加到您的 schema.sql CREATE ALIAS STUDENT_PACKAGE.Set_Grades_To_A AS $$ void setGradesToA(String s) { new StringBuilder(s).reverse().toString(); } $$;

关于oracle - 如何在 H2 中定义 Oracle Package Procedure 以进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57062428/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com