如何创建 PL/SQL 包以丢弃多级级联视图
Posted
技术标签:
【中文标题】如何创建 PL/SQL 包以丢弃多级级联视图【英文标题】:How to create a PL/SQL package to discard multiple level of cascading views 【发布时间】:2017-02-14 10:15:49 【问题描述】:我正在开发一个需要创建 PL/SQL 包的 CR,但我对这种方法有点困惑。
背景:有一个名为 ‘D’ 的视图,它按顺序位于相互依赖的视图链的末端。 我们可以把它写成: A – 事实表(使用 Informatica 填充,来源 MS-Dynamics) B – 基于事实表查看 1 C – 基于 View1 的视图 2 D – 基于 view2 的视图 3 每个视图与基础视图的结构中的其他表有多个连接。
要求:客户希望删除所有这些视图并创建一个 PL/SQL 包,该包可以将数据直接从 MS-Dynamics 插入到 View3 中,即“D”。
在我想出一些复杂的东西之前。我想知道,是否有任何标准方法可以满足此类要求。
感谢任何意见/建议。
【问题讨论】:
【参考方案1】:很明显,您仍然需要一个事实表来保存一些数据。
您可以通过使 D 更复杂来摆脱 B 和 C(WITH
子句可能有助于使其保持可监督性)。
将数据插入 D 本身(很可能)是不可能的,但您可以创建和 INSTEAD OF INSERT
触发器来处理它,即改为插入事实表 A。
使用WITH
子句的示例:
代替
create view b as select * from dual;
create view c as select * from b;
create view d as select * from c;
你可以写
create view d as
with b as (select * from dual),
c as (select * from b)
select * from c;
如您所见,现有视图定义以 1:1 的比例进入 WITH
子句,因此创建一个视图来组合所有视图并不难。
【讨论】:
【参考方案2】:如果您使用的是 Oracle 12c,您可能会查看 DBMS_UTILITY.EXPAND_SQL_TEXT,但您可能需要稍微清理一下输出以提高可读性。
【讨论】:
【参考方案3】:先做几件事
1) 视图是预定义的 sql 查询,因此无法直接向其中插入记录。即使是持久表结构的物化视图也只会填充查询结果,因此就目前情况而言,这是不可能的。可以创建一个新表来填充当前在视图 D 处聚合的数据
2) 很可能在 Informatica 中使用多个内联排序器和聚合器转换的组合来聚合多个级别的数据,这将生成您正在寻找的级别的数据。
3) 你应该这样做吗?数据仓库最佳实践会拒绝,并根据原始表 A 尽可能保持数据的粒度,以便可以通过多种方式对其进行汇总(请参阅 Kimball 集团网站并阅读星型模式以了解此类问题)。不过,您对选择有很大影响吗?
4) 当前流程(虽然经常使用)在星型模式方面并没有那么好
【讨论】:
以上是关于如何创建 PL/SQL 包以丢弃多级级联视图的主要内容,如果未能解决你的问题,请参考以下文章