【问题标题】:Oracle nullable and non nullable column in a view视图中的 Oracle 可为空和不可为空的列
【发布时间】:2013-04-11 14:57:47
【问题描述】:

我在 Oracle 中有一张表。此表包括:EMPLOYEE_ID(NUMBER,Nullable,但 NULL 数为 0)和 EMPLOYEE_NUMBER(VARCHAR2,Nullable,但 NULL 数为 0)。

现在我在这个表上创建一个视图:

CREATE OR REPLACE FORCE VIEW APPS.XXKE_L2E_EMPLOYEE
(
   PERSON_ID,
   EMPLOYEE_NUMBER,
   ...
)
AS
   SELECT EMPLOYEE_ID,
          EMPLOYEE_NUMBER,
          ...
     FROM xxke.xxke_employees e
          INNER JOIN xxke.xxke_organizations o ON e.organization_id = o.organization_id
          INNER JOIN xxke.xxke_operating_units ou ON e.org_id = ou.org_id;

ALTER VIEW APPS.XXKE_L2E_EMPLOYEE
ADD CONSTRAINT XXKE_L2E_EMPLOYEE_V_PK
PRIMARY KEY(PERSON_ID) DISABLE;

在那个视图中 PERSON_ID 怎么可能变成 Nullable(即使使用 NVL 技巧),但 EMPLOYEE_NUMBER NOT Nullable

问题: 如何让 Oracle 以某种方式创建视图,使 PERSON_ID 列在视图中变为 NOT Nullable?或者我怎样才能让我的 WCF oData 服务查询这个视图。目前在更新 edmx 文件后,我得到以下信息:

错误:Oracle.ssdl(227,6):错误 0075:关键部分:XXKE_L2E_EMPLOYEE 类型的“PERSON_ID”无效。密钥的所有部分都必须不可为空。

【问题讨论】:

  • 可能是因为您在其中一列上使用 NVL 而不是其他列?
  • 你已经让你的愤怒妨碍了提供一个明确的问题。请解释实际发生的情况以及与您希望发生的情况有何不同。
  • @MichalB.:等等,是 SQL Server 还是 EF 告诉您这些列可以为空?检查视图在 SQL management Studio 中的情况
  • 可能相关:stackoverflow.com/q/11097839/266304(也交叉发布为dba.stackexchange.com/q/19484/847)。您是说您需要视图的元数据以将列显示为not null,以便 EF 受益,就像那个问题一样?
  • 坦率地说,我们也无法理解“为什么 EMPLOYEE_NUMBER 最终会变成 NON NULLABLE”。 Oracle 视图从底层表继承它们的非空约束。因此,如果表中的源列不是 NULL,视图应该只显示该列的 NOT NULL。

标签: sql oracle oracle11g nullable sql-view


【解决方案1】:

它变为可空的原因是在创建视图查询时您在employee_id 上使用了nvl。员工在查询中不可为空,这就是它不可为空的原因。在视图中,oracle 使结果列可以为空。视图不是静态的,而只是一个查询。如果您不想遇到问题,您可以创建表的物化视图,并在查询中预先应用 nvl,然后查询将不会选择 null 可能。然后你可以做索引,查询会明显更快。

【讨论】:

  • 这个答案是错误的。有无 NVL 功能都一样。为了这个问题,我实际上应该删除 NVL。它只会带来不必要的混乱......
【解决方案2】:

如果您希望视图中的列不可为空,则与包含该列作为主键的表进行内部联接,并在视图定义中从该表中选择(在这种情况下)PERSON_ID。这样就解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2021-11-02
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多