视图

时间:2017-02-20 19:05:18

标签: db2 db2-400

我有一张桌子的视图。事实证明,表格会被移动,并且每晚都会创建一个更新版本。这可以确保数据库中始终存在预期名称的表,但是我找不到一种方法可以使我的视图继续指向表的当前版本。创建视图时存在的哪个表是我最终指向的表,即使它移动并变得陈旧。

ViewA:

select a, b, c from todays_table;

todays_table整天保持最新状态,然后在晚上重命名为todays_table01。查看A现在指向todays_table01,新表格显示为todays_table。同样,todays_table是最新的,但ViewA不再是。

有没有办法延迟表名解析直到使用视图?我无法让EXECUTE IMMEDIATESELECT声明工作。如果我使用游标,我想我可以得到一个动态SQL语句,但我以前从未需要这些,我不确定它们是否是正确的路径。我读到了AUTO_REVAL,但我相信这只会延迟解决,直到第一次使用该视图并且当晚仍然过时。

当然,我可以停止使用视图,只是将复杂的查询移动到我的程序中,但是有很多地方需要它,所以我想在回到这个之前消除所有其他解决方案。

理想的做法是消除临时表并让主表全天接收更新,但这是我无法理解的,因为我对RPG II和OCL一无所知。

感谢阅读。

修改 每个@Mr。 Llama的建议,我尝试使用同义词和别名指向todays_table,然后让我的观点指向同义词。不幸的是,在这种情况下,视图使用别名来解析创建时的实际表名,以便视图在重命名为todays_table时继续指向todays_table01,尽管别名继续引用{{1 }}。

编辑2 我接受@ mustaccio的答案,因为它确实有效,如果我可以将参数调到他们需要的地方,这将是一个合理的方法来解决这个问题。我的特定项目需要灵活性,因此我实际上会跳过夜间流程并添加一个程序来重新创建我的观点,因为@ danny117建议使用他们的引用。

感谢所有回复的人,我学到了很多关于所有这些部分如何协同工作的知识。

1 个答案:

答案 0 :(得分:2)

我认为你可以通过将视图定义包装在SQL表函数中来实现你想要的东西,比如

CREATE FUNCTION insteadofview (<parameters>)
RETURNS TABLE (<columns>)
...
RETURN
  SELECT <the rest of your view definition>

根据您查询视图的方式,您可能需要将搜索条件作为参数传递给函数,否则性能将不是最理想的,因为在应用搜索参数之前,函数必须返回查询中的所有行。

According to the manual,因为您注意到重命名的表上的视图继续指向原始表 object 。但是,包括表函数在内的例程将在下次调用时使用原始源表 name 进行无效处理并再次准备计划。

我无法对此进行测试。

Full syntax to create a table function