我可以创建一个Oracle视图来自动检查新的月度表吗?

我可以创建一个Oracle视图来自动检查新的月度表吗?,oracle,oracle10g,Oracle,Oracle10g,我想知道是否有可能创建一个视图来自动检查是否有一个新的每月创建的表,以及是否有包含该表的表 我们每个月都会创建一个新表,每个表都以月份的编号结束,如 table for January: table_1 table for February: table_2 etc... 是否可以创建一个视图,该视图从所有这些表中获取数据,并在创建新表时进行查找?如果您每月为现有表创建新分区,而不是创建新表,则该视图是可能的 更新: 如果您有不带分区选项的OracleSE,您可以创建两个表:LiveTabl

我想知道是否有可能创建一个视图来自动检查是否有一个新的每月创建的表,以及是否有包含该表的表


我们每个月都会创建一个新表,每个表都以月份的编号结束,如

table for January:  table_1
table for February: table_2
etc...

是否可以创建一个视图,该视图从所有这些表中获取数据,并在创建新表时进行查找?

如果您每月为现有表创建新分区,而不是创建新表,则该视图是可能的

更新:


如果您有不带分区选项的OracleSE,您可以创建两个表:LiveTable和ArchiveTable。然后每个月您都需要将行从活动表移动到可归档且干净的活动表。在这种情况下,您只需要从两个表中创建视图。

如果您每月不创建新表,而是为现有表创建新分区,则可以创建视图

更新:


如果您有不带分区选项的OracleSE,您可以创建两个表:LiveTable和ArchiveTable。然后每个月您都需要将行从活动表移动到可归档且干净的活动表。在这种情况下,您需要仅从两个表创建视图。

否,视图的定义是静态的。您必须每月用包含新表的新副本替换视图;您可以编写一个动态PL/SQL程序来实现这一点。或者您可以现在创建所有空表,并将它们全部包含在视图定义中;如有必要,您可以推迟授予对未来表的任何INSERT访问权,直到它们变为“活动”状态


但实际上,这个模型是有缺陷的——请参阅Michael Pakhantsov的答案,以获得更好的替代方案——或者只是有一个带有月列的简单表。

不,视图的定义是静态的。您必须每月用包含新表的新副本替换视图;您可以编写一个动态PL/SQL程序来实现这一点。或者您可以现在创建所有空表,并将它们全部包含在视图定义中;如有必要,您可以推迟授予对未来表的任何INSERT访问权,直到它们变为“活动”状态


但实际上,这个模型是有缺陷的——请参阅Michael Pakhantsov的答案,以获得更好的替代方案——或者只使用一个带有月列的简单表。

另一个选项是在另一个模式中创建表,并授予相关用户权限,并为其创建公共同义词


在本地模式中创建月度表时,它们将“优先”公共同义词,视图将接收它们。它仍然会失效并需要重新编译,但实际的视图文本应该需要更改,从代码控制的角度来看,这可能更简单。

另一个选项是在另一个模式中创建表,并授予相关用户权限,并为其创建公共同义词


在本地模式中创建月度表时,它们将“优先”公共同义词,视图将接收它们。它仍然会失效并需要重新编译,但实际的视图文本应该需要更改,从代码控制的角度来看,这可能更简单。

您可以编写一个过程或函数,查看
用户表
所有表
,以确定表是否存在,生成动态sql,并返回一个带有数据的ref游标。管道函数也可以做到这一点。

您可以编写一个过程或函数,查看
用户表
所有表
,以确定表是否存在,生成动态sql,并返回带有数据的ref游标。管道函数也可以做到这一点。

“我们每个月都会创建一个新表”-不要。如果您需要每月组织数据,请添加一列“月”。我很好奇:明年1月会发生什么?因为轮换的不是“我的”程序,我们不允许在不失去支持的情况下更改其工作方式,因此我对此无能为力。如果可以的话,我可能会像迈克尔·帕汉索夫建议的那样把它分割开来。它将只保留一年的记录,因此明年1月它将只替换旧的表。现在不可能创建所有12个表,以便视图定义可以是静态的吗?“我们每个月创建一个新表”-不要。如果您需要每月组织数据,请添加一列“月”。我很好奇:明年1月会发生什么?因为轮换的不是“我的”程序,我们不允许在不失去支持的情况下更改其工作方式,因此我对此无能为力。如果可以的话,我可能会像迈克尔·帕汉索夫建议的那样把它分割开来。它只会保存一年的记录,所以明年1月它将只替换旧的_1表。现在不可能创建所有12个表,以便视图定义可以是静态的吗?