视图中的Oracle可空和非可空列

时间:2013-04-18 13:10:10

标签: sql oracle oracle11g nullable sql-view

我在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 不可为空

问题: 如何让Oracle以某种方式创建视图,因此PERSON_ID列在视图中变为不可为空?或者如何让我的WCF oData服务查询此视图。目前在更新edmx文件后,我得到以下内容:

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

2 个答案:

答案 0 :(得分:0)

它变为可空的原因是在创建视图查询时,您在employee_id上​​使用了nvl。员工在查询中不可为空,这就是为什么不是。在视图中,oracle使得结果列可以为空。视图不是静态的,只是查询。如果您不想遇到此问题,可以使用查询中应用的nvl创建表的物化视图,然后查询将不会选择null。然后,您可以显着更快地执行索引和查询。

答案 1 :(得分:0)

如果希望视图中的列不可为空,则使用包含此列的表作为主键进行内部连接,并在视图定义中从该表中选择(在本例中)PERSON_ID。这解决了这个问题。