如何创建 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 包以丢弃多级级联视图的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 07 触发器 trigger

PL/SQL-如何使用游标的所有列插入表

如何找到Oracle Forms接口集成的PL/SQL程序

用于创建视图的 ODB PL/SQL API?

Oracle PL/SQL 过程/函数来创建包含列的视图

PL/SQL 过程 X 引用视图 Y [关闭]