如何在H2中定义Oracle Package procedure进行测试

2024-04-26

我正在测试一个 Spring Boot 应用程序,该应用程序将数据读取/写入 Oracle DB。该 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();
}

因此,它使用本机查询来调用过程Set_GradesToA in the STUDENT_PACKAGE包的sch1 schema.

我目前正在测试 Spring Boot 应用程序的功能NOT它与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_Aprocedure 我关心的是如何定义它。

当我按照上面的方式创建别名时,我仍然收到语法错误。

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:为了回答这个问题,我必须更改本机查询,如下所示

@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:回答这个问题涉及三件事。现在我已经更改了上面的本机查询,我得到了一个不同的错误:

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.url in the application.properties file.

  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_PACKAGE到最后spring.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(); } $$;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在H2中定义Oracle Package procedure进行测试 的相关文章

  • 创建和删除表空间 Oracle

    我已经创建了这个表空间 CREATE TABLESPACE IA643 TBS DATAFILE IA643 dat SIZE 500K AUTOEXTEND ON NEXT 300K MAXSIZE 100M 我尝试使用此命令删除它 DR
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • 如何使用 JSON_TABLE 从 Oracle JSON 列获取键值作为结果集

    我用谷歌搜索了很多 似乎无法找到适合我的简单用例的简单解决方案 我在 Oracle 12C 数据库中有一个 json 列 当然实际上是一个带有 json 约束的 varchar 在该列中我存储了这样的 Map 表示 a 9 0847 b 8
  • 为什么 html 页面没有在 thymeleaf 中显示?

    我在用着spring boot和thymeleaf查看引擎 问题是控制器没有显示正确的 html 页面 并且总是显示Whitelabel Error Page 控制器 package com example controller impor
  • Spring Kafka - 如何使用 @KafkaListener 重试

    来自推特的问题 只是想找到一个使用 spring kafka 2 1 7 的简单示例 该示例与 KafkaListener 和 AckMode MANUAL IMMEDIATE 一起使用 以重试上次失败的消息 https twitter c
  • SQL使用多个/相关列计算项目频率?

    我对 SQL 完全陌生 并且阅读了有关 SQL 的 StackOverflow 帖子来尝试弄清楚这一点 以及其他来源 但无法在 SQL 中执行此操作 开始 我有一个 3 列和数千行的表 其中包含前 2 列的数据 第三列当前为空 我需要根据第
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 如何登录Oracle数据库?

    我对 Oracle 数据库中常用的日志记录方法感兴趣 我们的方法如下 我们为要记录的表创建一个日志表 日志表包含原始表的所有列以及一些特殊字段 包括时间戳 修改类型 插入 更新 删除 修改者的 id 原始表上的触发器为每次插入和删除创建一个
  • 如何使用Spring @Value注解来设置值?

    最近开始学习Spring核心框架 我对将 spring 与 XML 一起使用很有信心 但只想尝试基于注释的程序 但现在我陷入了这个 Value 注释 我有一个类 Line 扩展 Shape 接口 它使用 Point 对象作为依赖项 Poin
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • Power BI 中的区分大小写

    我想知道是否可以在 Power BI 中配置区分大小写 我在 Oracle 数据库中有数据 其中主键EXample不同于exampLE 但如果我想将其导入到Power BI中 就不行了 任何想法 目前 我认为最好的选择是在查询编辑器阶段为主
  • 如何从 Visual Studio 以调试模式运行 NUnit?

    我最近正在为我一直在研究的一些 C 构建一个测试框架 我在工作区中设置了 NUnit 和一个新项目来测试该组件 如果我从 Nunit v2 4 加载单元测试 一切都会很好 但我已经到了在调试模式下运行并设置一些断点非常有用的地步 我已经尝试
  • 使用绑定和空值命中 Oracle 索引的最佳查询

    我有一个表 该表在多个列上有一个索引 其中许多列可以为空 CREATE UNIQUE INDEX UX MYTABLE A B C D E ON MYTABLE A B C D E 现在 我在 C 代码中尝试检查该表并精确命中索引 对于每个
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 使用 JPA 时如何在部署时设置序列的架构名称?

    出于安全原因 我们的 Oracle 数据库对象通常属于与登录用户不同的架构 例如 表位于 xx core 中 我们登录的用户是 xx app yy 在我的 persistence xml 中 我定义了一个 orm 文件 以便我可以在部署时指
  • 如何让 @PostAuthorize 失败导致 @Transactional 回滚?

    我的应用程序中有一些复杂的访问限制 这些限制基本上需要结合用户的角色以及域对象的一些深层属性来做出访问决策 对于我的一些方法 特别是像getItem Integer id and updateItem Integer id FormBean
  • 是否允许在流水线 PL/SQL 表函数中使用 SELECT?

    管道函数的文档指出 在 SQL 语句 通常是SELECT 并且在大多数示例中 管道函数用于数据生成或转换 接受客户作为参数 但不发出任何 DML 语句 现在 从技术上讲 可以使用 SELECT 而不会出现 Oracle 中的任何错误 ORA
  • Oracle 数据库 12c 尝试连​​接时出错:网络适配器无法建立连接

    我第一次安装Oracle数据库12c 我正确地遵循了所有步骤并将其安装在 Windows 7 64 位上 但是当我单击 SQL Developer 并尝试创建新连接时 我输入了用户名和密码等信息 最后单击 测试 按钮 我得到了这个错误消息
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT

随机推荐

  • 是否可以在不使用清单的情况下设置 Powershell 模块名称/版本?

    我可以看到 如果没有清单 默认模块名称将设置为 psm1 文件名 但是有没有办法在模块代码中设置它 我也想在代码中设置版本 如果您要导入二进制模块 则将从程序集元数据中提取模块版本 然而 该名称只是 DLL 的文件名 对于脚本模块 psm1
  • 尝试在整数后添加字符然后打印结果时出现奇怪的结果

    我正在尝试创建一个简单的欧姆定律计算器 所以我们的想法是你可以填写两个变量 然后它会计算第三个变量 当我创建这个程序时 我发现了一个小问题 我不明白它是如何发生的 不幸的是我无法找到答案 我尝试打印一个显示完整计算的字符串 用户填写的两个变
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • WCF OperationContract 方法的 WebGet 属性可以有多个 ResponseFormat 类型吗?

    我有一个 ServiceContract 描述 WCF 服务中使用的方法 该方法具有定义 UriTemplate 和 ResponseFormat 的 WebGet 属性 我想重用单个方法并拥有多个具有不同 UriTemplate 和不同
  • 将正则表达式拆分为 2 个捕获组

    好吧 我之前的问题都得到解答了 我还有一个 这个对我来说比较难 A Za z A Za z0 9 domain com 现在这个表达式只产生 1 个捕获组 如 所示 我该如何为此 URL 执行 2 个捕获组 用于IIS正则表达式重写 您可以
  • 通过wget命令爬取sitemap.xml的链接

    我尝试抓取 sitemap xml 的所有链接以重新缓存网站 但是 wget 的递归选项不起作用 我只得到响应 远程文件存在 但不包含任何链接 无法检索 但可以肯定的是 sitemap xml 充满了 http 链接 我尝试了 wget 的
  • MySQL 一对多转 JSON 格式

    我有两个 MySQL 表 User id name Sale id user item Where Sale user 是一个外键User id 所以这是一种一对多的关系 一个用户可以进行多次销售 我试图从数据库中获取它并以 JSON 格式
  • jquery .ajax() 问题

    我正在使用 Jquery 1 7 1 但遇到了问题 我正在脚本中使用 CRM 并正在努力完成页面 但我遇到了这个问题 my html
  • 在 iOS 中禁用文本选择标注

    我知道当用户长按某个按钮时您可以禁用标注link使用这个 body webkit touch callout none important a webkit user select none important 但是文本选择菜单呢 我的用例
  • 重写具有不同返回类型的成员函数

    考虑下面的例子 include
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • 仅适用于数字和连字符的正则表达式

    我试图理解正则表达式 对于长度为 10 的数字我可以简单地做 0 9 10 对于连字符只有我能做 使用组表达式将两者结合起来将导致 0 9 10 该表达式无法按预期工作 如果字符串无效 它会以某种方式匹配字符串的一部分 而不是根本不匹配 如
  • Hibernate无法打开连接

    我在休眠时遇到问题 无法打开连接 我有一个 DAO public class MyDao extends HibernateDaoSupport DataSource dataSource public void setDataSource
  • 安卓浏览器有bug? div溢出滚动

    你能让div的溢出内容在Android浏览器中滚动吗 它在所有其他现代浏览器中都是可滚动的 在 iOS 中 它是可滚动的 但它不显示滚动条 但可以通过拖动来滚动 一个简单的例子 http jsfiddle net KPuW5 1 embed
  • .hide("slow") 是同步方法还是异步方法?

    据我们所知 ajax 是一个异步方法 因为下一个语句之前开始执行ajax 方法已完全执行 ajax 继续并行执行其工作 并且hide 是一个同步方法 因为它立即隐藏元素 并且下一条语句将在何时执行hide 确实完成了他的全部任务 但我真的很
  • 此 xpath 查询的 Flex/AS3/E4X 等效项是什么?

    鉴于此文档
  • 一个应用程序的最大线程数?

    我想知道一个应用程序的最大线程数 您知道 Thread activeCount 返回正在运行的线程组及其子组中的活动线程数 如果我知道当前活动中要创建的最大线程数 我就可以限制活动线程 我正在使用线程进行 http 连接并捕获 Http 响
  • 类通过回调提供数据

    在用 C 编程一段时间后 我最近回到了 Visual C 因为 C 中的回调要容易得多 我有一个控制 0 连接设备的单例类 我的想法是在此类中创建一个函数 它将迭代一组 连接的设备并通过回调将其发布到任何可能需要它的地方 e g Singl
  • C++ 或 Java 中保存 20 位整数的数据类型

    Java 或 C 中是否有可以保存 20 位或更多数字的整数值的数据类型 long long 数据类型最多只能容纳 18 位数字 Java具体 您正在寻找BigInteger http docs oracle com javase 7 do
  • 如何在H2中定义Oracle Package procedure进行测试

    我正在测试一个 Spring Boot 应用程序 该应用程序将数据读取 写入 Oracle DB 该 Oracle DB 具有 Oracle 包以及这些包中的过程 在某些时候 Spring Boot应用程序通过实体存储库调用此过程 如下所示