这可能是一个愚蠢的问题,但是由于oracle允许创建不同对象的表,我想也许可以创建一个视图表。
我需要生成许多很多视图(这将会转动某些表)。每个视图都有不同的列名。
我不想用名为数百或数千个视图来污染命名空间
schema.xls_import_id_1234_sheet_0
。
是否可以创建一个视图表?然后用
之类的东西查询它们select * from table(
select a_view from xls_sheet_views where xls_id = 1234 and sheet_no = 0)
或者也许是一种只将查询存储为varchar2类型的方法,以及一些自动执行它的方法?
答案 0 :(得分:4)
不,你不能创建一个视图表。
根据您尝试解决的确切业务问题,可能您可以在包中的流水线表函数中实现逻辑,而不是拥有数千个视图。如果你有很多视图,因为你正在为你可以转向的每个属性组合创建一个单独的对象,那么使用一个接受一些参数而不是拥有数百个视图的流水线表函数可能是有意义的。或者,在包中返回SYS_REFCURSOR
。
通常,如果要使用流水线表函数,则需要知道结果的结构。但是,通过在Oracle对象类型中使用多态,您可能会变得棘手。您可以声明单个对象类型,派生多个子类型,然后从父类型上定义的流水线表函数返回子类型的实例。 Adrian Billington就是这种flexible pipelined table function的一个很好的例子。但是,使用Data Cartridge框架可以让您更加疯狂,并开发pipelined table function that returns an arbitrarily structured result。现在,仅仅因为你可以做这样的事情,我当然不会主张在没有经过深思熟虑的情况下实际做到这一点。需要使用这种级别的动态代码来处理像转动某些数据这样常见的东西会让我强烈怀疑你需要退一步看看系统的架构。