【发布时间】: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