【问题标题】:Oracle View base on a PIVOT query not null values基于 PIVOT 查询的 Oracle 视图不是空值
【发布时间】:2013-01-22 11:28:50
【问题描述】:

当基于 PIVOT 查询创建视图时,所有视图字段在视图元数据中都变为 NULLABLE,有没有办法让它们不为 NULLABLE?

我在需要为 NOT NULL 的透视字段中使用 NVL 函数,但它们仍然变为 NULLABLE。

这对我来说是个问题,因为我使用的是 MS Entity Framework,它不会根据没有 NOT NULLABLE 列的表或视图更新模型。

【问题讨论】:

  • 我认为它不适用于解决我的问题。因为即使我在被查询的表中创建一个新的虚拟列,PIVOT 函数也会将该字段变为空。我错过了什么吗?
  • 它是一个 PIVOT 查询可能与视图元数据的核心问题无关。
  • @MiguelMatos 你用的是什么版本的VS?

标签: c# sql database oracle entity-framework


【解决方案1】:

@Miguel,我不知道“MS Entity Framework”,但这个名字听起来像是一个面向编辑数据的框架。 “实体”通常用于构建数据库数据的缓存,以准备将数据更改和更新回数据库。这似乎不是您想要做的。

重新阅读这个问题,我相信您有某种枢轴生成器正在使用来为用户即时创建视图。因此,您不打算修改实体模型。我认为您根本不需要实体模型。

实体框架可能会寻找 NOT NULL 列,以便找到它可以使用的“主键”或其他行级标识符。为什么要这些?

  • 提供可用于更新任何行的密钥
  • 为结果集提供分页键
  • 提供支持对结果集进行内存过滤的密钥
  • 支持对结果集进行动态排序操作

我还推测您有某种 UI 控件可以很好地呈现“实体”集合,因此您想使用该控件。

控件可能不需要“实体” - 检查它的接口是什么。也许有一个实体的超类或一个您可以生成的接口,而不是一个可更新的实体。如果你能做到这一点,你应该能够在漂亮的 UI 控件中呈现它,而不是用你的 NULLABLE 列撞墙。

【讨论】:

  • 您可以将实体框架视为一个层,它将数据库对象映射到应用程序域中的类,允许开发人员使用强类型对象与数据库进行交互。我们的应用程序的结构方式是所有数据库访问都是使用实体框架进行的,它是我们的数据访问层。
  • 是的,但是您对实体框架的描述清楚地表明,它强烈地面向更新数据。这与您声明的意图不符,也不符合您视图的语义。是不是有一个不可更新的类或接口可以用来代替实体?
  • +1 Andrew 在这里提出了一些重要的观点。我还要补充一点,我已经看到了使用 ORM 框架和根据需要直接查询的实现。
  • 我理解你的观点,它们是有效的。正如 Andrew 所说,使用 ORM 框架的主要原因之一是拥有持久对象。在这种特定情况下,我不是在寻找更新数据,但我希望能够以我们在所有应用程序中使用的相同方式检索数据,允许我们拥有一个强类型对象而无需创建一个手动为我们正在使用的每个视图,并且只维护一个数据库访问层。
【解决方案2】:

其中一种可能的解决方案是根据查询结果动态生成一个新表,并在此之后调整该表的约束条件。 对于太多的动态 SQL,我不喜欢这种方法 :)

另一种解决方案是预构建物化视图。 在这里查看 (Oracle docs) 的“ON PREBUILT TABLE 条款”。

【讨论】:

  • 我认为在您提出的两个建议中,我都无法访问实时数据,只能访问基于查询数据创建的快照。我错过了什么吗?谢谢。
  • 您想要一个可编辑的记录集作为 PIVOT 查询的结果吗?我没想到会这样 :) 通常 PIVOT 用于折叠数据。所以结果将不允许编辑。
  • Miguel,这篇文章中的答案 (stackoverflow.com/questions/11214448/…) 能帮到你吗?
【解决方案3】:

您需要在 Visual Studio (VS) 中更新您的模型。因为这不知道每一列中的类型信息是什么。然后您必须在数据透视表的查询中指定数据类型。例如,使用 to_number 指定显式转换。当您要在 VS 中更新模型时,您必须基于例如物化视图(具有明确定义的数据类型)。请使用基于数据透视表的明确定义的数据类型创建物化视图(这不仅必须包含 nvl 函数,还必须包含定义的数据类型、字符串、数字等),然后更新您的模型。 只有物化视图?不,它可以是一张桌子(但很麻烦)。可以直接来自数据透视表吗?并不总是有效(如您的情况)。重要的是有定义的数据类型。

【讨论】:

  • 物化视图不是一个选项,因为它不是基于实时数据,它必须更新。使用视图时,即使我在字段中使用 NVL,它在视图元数据中仍然可以为空。由于所有字段都是可为空的,因此在 VS 中更新模型时不会添加视图,因为 EF 需要具有唯一的不可为空字段才能将表添加到模型中。
【解决方案4】:

如果您不需要很多这些视图,您可以使用 code-first,Scott Gu 有一篇很好的文章 "Code first with existing database" 展示了如何做到这一点。

这可能需要有 2 种访问数据库的方法,这可能适合您,也可能不适合您。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多