首页 文章

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

提问于
浏览
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是 NOT Nullable

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

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

2 回答

  • 0

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

  • 0

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

相关问题