【问题标题】:Identify schema inside a UDF in Db2在 Db2 中识别 UDF 内的模式
【发布时间】:2018-12-13 15:57:35
【问题描述】:

在 Db2 中,我在多个模式中定义了相同的用户定义函数。如何检索用于 UDF 中当前调用的架构?

CURRENT_SCHEMA 特殊寄存器在我的情况下不起作用,因为它仅在 SET CURRENT SCHEMA '...' 之后起作用(未使用)。

还有其他可能吗?

UDF 示例:

--#SET TERMINATOR #
CREATE FUNCTION SCHEMA1.TEST_UDF ( )
   RETURNS VARCHAR(100) LANGUAGE SQL
BEGIN
   RETURN CURRENT_SCHEMA;
END#
CREATE FUNCTION SCHEMA2.TEST_UDF ( )
   RETURNS VARCHAR(100) LANGUAGE SQL
BEGIN
   RETURN CURRENT_SCHEMA;
END#
--#SET TERMINATOR ;

调用:

SELECT SCHEMA1.TEST_UDF() FROM SYSIBM.SYSDUMMY1;

我希望看到“SCHEMA1”作为此调用的输出。

【问题讨论】:

  • 呃,为什么你在多个地方定义了相同的函数?为什么它甚至重要?你打算用这些信息做什么? “当前调用”是什么意思? CURRENT_SCHEMA 将为您提供解析对象的“默认”模式,但这不会是唯一查看的模式(由 SQL 路径/库列表处理)。通常你会选择一个规范的副本并且只调用它。
  • @Clockwork-Muse:我提供了一个 UDF。客户可能会多次将此过程部署到不同的模式(尤其是在 Db2 z/OS 上),例如用于开发、测试、QA、预生产……所以我最终可能会将单个 UDF 逻辑部署到多个模式中,并且需要找出我当前运行的模式以从该模式中查询更多信息.
  • 糟糕的用例:为不同的环境部署到不同的模式。通常你会想要在不同的数据库上使用同名的模式——否则你很有可能从错误的模式中获取一些东西。 (就此而言,无论如何,为 dev/test/QA 提供专用框可能应该换成 dockerized 版本,这也消除了多个模式)并且在这种情况下知道你的“当前”模式是什么是有问题的 无论如何,因为从部署的角度来看,其他部署不应该存在

标签: db2 user-defined-functions


【解决方案1】:

使用ROUTINE_SCHEMA 全局变量。

--#SET TERMINATOR #
CREATE OR REPLACE FUNCTION SCHEMA1.TEST_UDF ( )
   RETURNS VARCHAR(100) 
BEGIN
   RETURN ROUTINE_SCHEMA;
END#

【讨论】:

  • 谢谢,马克。但是,这实际上意味着不同的 UDF,因为它们的特定名称需要在函数体中编码。我真的需要相同的 UDF。如果有一种通用的方法来识别当前运行的函数的特定名称,那么查询系统表对我来说将是一个可行的解决方案。
  • 一个缺点:ROUTINE_SCHEMA 似乎仅在 Db2 LUW 中可用,但在 z/OS 上的 Db2 中不可用。我将提出一个新的具体问题,看看是否有人知道 Db2 z/OS 的替代方案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多