我在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 回答
它变为可空的原因是在创建视图查询时,您在employee_id上使用了nvl . 员工在查询中不可为空,这就是为什么不是 . 在视图中,oracle使得结果列可以为空 . 视图不是静态的,只是查询 . 如果您不想遇到此问题,可以使用查询中应用的nvl创建表的物化视图,然后查询将不会选择null . 然后,您可以显着更快地执行索引和查询 .
如果希望视图中的列不可为空,则使用包含此列的表作为主键进行内连接,并在视图定义中从该表中选择(在本例中)PERSON_ID . 这解决了这个问题 .