如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?

Posted

技术标签:

【中文标题】如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?【英文标题】:How do I pass Oracle PL/SQL constants as parameters using jOOQ? 【发布时间】:2021-12-27 14:51:07 【问题描述】:

我正在尝试将一些使用 PL/SQL 的 Oracle 查询转换为 jOOQ。使用代码生成器,大多数包查询、存储过程等都很容易。但是,在几个地方使用了一个功能,我还没有找到 jOOQ 替代方案:

begin
  MY_SCHEMA.MY_PACKAGE.MY_QUERY(some_param => MY_SCHEMA.MY_PACKAGE.SOME_CONSTANT)
  -- more code
end;

我可以很好地调用查询,但我不确定如何将MY_SCHEMA.MY_PACKAGE.SOME_CONSTANT 值传递给它。 jOOQ 代码生成器似乎没有为常量生成任何东西(至少,我找不到任何类似名称的东西)。我需要在生成器上启用功能吗?还是我需要查询这些常量?如果有,怎么做?

【问题讨论】:

如果重要的话,我使用的是 jOOQ 3.15.4 和 Oracle 19。 我不知道某个选项,因为我认为它们不存在于数据字典中。如果发现这个问题github.com/jOOQ/jOOQ/issues/6504但是我不知道PLSCOPE 【参考方案1】:

启用 PL/Scope 以使其工作

jOOQ 可以为您的包常量生成代码如果它可以在您的ALL_IDENTIFIERS 字典视图中找到它们。只有在编译包时启用PLSCOPE_SETTINGS 时才会出现这种情况,例如使用:

ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL'

有了这些,jOOQ 将为您的包常量生成表达式,您可以在例程调用或其他procedural logic 中使用这些表达式。

PL/范围独立

Simon Martinelli 在 cmets 中提到的是问题 https://github.com/jOOQ/jOOQ/issues/6504,即使没有打开上述 PL/Scope 设置,它也会尝试启用此代码生成支持,因为根据您的环境,这非常不可靠。

从 jOOQ 3.15 开始,还没有适用于任何 Oracle 环境的解决方案。 But you could use testcontainers to generate your jOOQ code 来自启用了 PL/Scope 的 Docker 映像。

【讨论】:

GenerationTool 是否尝试设置 ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL' 本身?如果没有,我在哪里可以连接它(或OracleDatabase)来设置它? @Jorn:这不是读取包的会话的属性,而是创建(并编译)它们的会话的属性,类似于javac 编译标志,允许在字节码中包含调试信息。所以我认为 jOOQ 生成器不适合这样做。 啊,我明白了。然后我想我对这个特定的数据库不走运,因为我不是生成模式的人。 @Jorn: 好吧,如果你可以将它复制到本地机器(例如通过testcontainers.org,例如使用 Gerald Venzl 的 XE docker 图像:hub.docker.com/r/gvenzl/oracle-xe),那么你可以重新编译带有PLSCOPE_SETTINGS 的软件包打开了,它应该可以工作吗?对于 CONSTANT 用例来说可能有点过分,但也许您可以通过其他方式改进您的开发?如果没有,您始终可以继承 OracleDatabaseJavaGenerator 来实现您自己的逻辑,例如在ALL_SOURCE中使用正则表达式搜索常量?

以上是关于如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Oracle (PL/SQL) 动态 sql 将数据查询到 %rowtype 变量中

oracle SQL语句中怎么样调用存储过程

如何使用间隔 1 分钟在两个日期之间将时间序列数据生成到 Oracle PL/SQL 中的表中?

Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?

如何将 PL/SQL 的输出(XML)存储在 oracle 表中

如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?