延迟 Table 视图中的名称解析
Delayed Table Name Resolution in View
我对 table 有看法。事实证明 table 被移动了,每晚都会创建一个更新版本。这确保了数据库中始终存在预期名称的 table,但我找不到使我的视图继续指向 table 的当前版本的方法。创建视图时存在的 table 是我最终指向的那个,即使它移动并变得陈旧。
视图A:
select a, b, c from todays_table;
todays_table
全天保持最新,然后在晚上重命名为 todays_table01
。视图 A 现在指向 todays_table01
,并且出现一个名为 todays_table
的新 table。同样,todays_table
是最新的,但 ViewA
不再是。
有没有办法延迟 table 名称解析,直到使用视图?我无法让 EXECUTE IMMEDIATE
为 SELECT
语句工作。我想如果我使用游标,我可以得到一个动态的 SQL 语句,但我以前从来不需要这些,我不确定它们是否是正确的路径。我阅读了有关 AUTO_REVAL
的信息,但我相信这只会延迟解决方案,直到第一次使用该视图并且当晚仍然过时。
当然,我可以停止使用视图并将复杂的查询移到我的程序中,但有很多地方需要它,所以我想在回退到这个之前消除所有其他解决方案。
消除临时 table 并让主 table 全天接收更新是最理想的,但这超出了我的理解范围,因为我对 RPG II 和 OCL 一无所知。
感谢阅读。
编辑
每@先生。在 Llama 的建议下,我尝试使用同义词和别名指向 todays_table
,然后让我的观点指向同义词。不幸的是,在这种情况下,视图在创建时使用别名来解析实际的 table 名称,因此视图在重命名为 todays_table01
时继续指向 todays_table
,尽管别名继续指向参考 todays_table
。
编辑 2
我接受@mustaccio 的回答,因为它确实有效,并且如果我能让参数到达他们需要的地方,这将是解决这个问题的合理方法。我的特定项目需要灵活性,所以我实际上要跳上夜间流程的潮流,并添加一个程序来在流程与他们的参考混淆后重新创建我的视图,如 @danny117 建议的那样。
感谢所有回复的人,我学到了很多关于所有这些部分如何协同工作的知识。
我认为您可以通过将视图定义包装在 SQL table 函数中来实现您想要的效果,例如
CREATE FUNCTION insteadofview (<parameters>)
RETURNS TABLE (<columns>)
...
RETURN
SELECT <the rest of your view definition>
根据您查询视图的方式,您可能需要将搜索条件作为参数传递给函数,否则性能将不理想,因为函数在搜索之前必须 return 查询中的所有行可以应用参数。
According to the manual,正如您注意到重命名的 table 上的视图继续指向原始 table 对象 。但是,包括 table 函数在内的例程将失效,并在下次调用时再次准备它们的计划,使用原始来源 table name.
虽然我没有办法测试这个。
我对 table 有看法。事实证明 table 被移动了,每晚都会创建一个更新版本。这确保了数据库中始终存在预期名称的 table,但我找不到使我的视图继续指向 table 的当前版本的方法。创建视图时存在的 table 是我最终指向的那个,即使它移动并变得陈旧。
视图A:
select a, b, c from todays_table;
todays_table
全天保持最新,然后在晚上重命名为 todays_table01
。视图 A 现在指向 todays_table01
,并且出现一个名为 todays_table
的新 table。同样,todays_table
是最新的,但 ViewA
不再是。
有没有办法延迟 table 名称解析,直到使用视图?我无法让 EXECUTE IMMEDIATE
为 SELECT
语句工作。我想如果我使用游标,我可以得到一个动态的 SQL 语句,但我以前从来不需要这些,我不确定它们是否是正确的路径。我阅读了有关 AUTO_REVAL
的信息,但我相信这只会延迟解决方案,直到第一次使用该视图并且当晚仍然过时。
当然,我可以停止使用视图并将复杂的查询移到我的程序中,但有很多地方需要它,所以我想在回退到这个之前消除所有其他解决方案。
消除临时 table 并让主 table 全天接收更新是最理想的,但这超出了我的理解范围,因为我对 RPG II 和 OCL 一无所知。
感谢阅读。
编辑
每@先生。在 Llama 的建议下,我尝试使用同义词和别名指向 todays_table
,然后让我的观点指向同义词。不幸的是,在这种情况下,视图在创建时使用别名来解析实际的 table 名称,因此视图在重命名为 todays_table01
时继续指向 todays_table
,尽管别名继续指向参考 todays_table
。
编辑 2 我接受@mustaccio 的回答,因为它确实有效,并且如果我能让参数到达他们需要的地方,这将是解决这个问题的合理方法。我的特定项目需要灵活性,所以我实际上要跳上夜间流程的潮流,并添加一个程序来在流程与他们的参考混淆后重新创建我的视图,如 @danny117 建议的那样。
感谢所有回复的人,我学到了很多关于所有这些部分如何协同工作的知识。
我认为您可以通过将视图定义包装在 SQL table 函数中来实现您想要的效果,例如
CREATE FUNCTION insteadofview (<parameters>)
RETURNS TABLE (<columns>)
...
RETURN
SELECT <the rest of your view definition>
根据您查询视图的方式,您可能需要将搜索条件作为参数传递给函数,否则性能将不理想,因为函数在搜索之前必须 return 查询中的所有行可以应用参数。
According to the manual,正如您注意到重命名的 table 上的视图继续指向原始 table 对象 。但是,包括 table 函数在内的例程将失效,并在下次调用时再次准备它们的计划,使用原始来源 table name.
虽然我没有办法测试这个。