2

我在 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不是 Nullable

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

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

4

2 回答 2

0

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

于 2013-04-18T16:41:43.340 回答
0

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

于 2017-01-11T10:53:53.183 回答