2013-04-18 3 views
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 становится не Nullable в представлении? Или как я могу заставить мою службу WCF oData запрашивать это представление. В настоящее время после обновления файла edmx я получаю следующее:

Ошибки: Oracle.ssdl (227,6): ошибка 0075: Ключевая часть: «PERSON_ID» для типа XXKE_L2E_EMPLOYEE недопустим. Все части ключа должны быть недействительными.

+0

Может ли это быть причиной того, что вы используете NVL на одном из столбцов, а не на otehr? – Limey

+1

Вы позволили вашему возмущению встать на путь предоставления четкого вопроса. Пожалуйста, объясните, что на самом деле происходит, и сделайте так, как вам понравится. – APC

+0

То же самое с NVL или без него. Более того, это то, что я получаю, когда пытаюсь получить доступ к представлению из Entity Framework, после обновления edmx: Указанная схема недействительна. Ошибки: Oracle.ssdl (227,6): ошибка 0075: ключевая часть: «PERSON_ID» для типа XXKE_L2E_EMPLOYEE недействителен. Все части ключа должны быть недействительными. Наилучшая часть заключается в том, что в VS2010 этот столбец автоматически устанавливается в не-nullable и помечен как PK ... –

ответ

0

Причина, по которой она становится нулевой, - это при создании запроса вида, который вы использовали nvl на employee_id. Сотрудник не имеет значения NULL в запросе, поэтому он не является. В представлении оракул делает итоговый столбец нулевым. Представления не являются статическими, а просто запросом. Если вы не хотите иметь проблему, вы можете создать материализованное представление таблицы с использованием nvl pre, применяемого в запросе, тогда запрос не будет иметь нулевой выбор. Затем вы можете делать индексы, а запросы будут значительно быстрее.

+1

Этот ответ неверен. То же самое с функцией NVL или без нее. На самом деле я должен был удалить NVL ради этого вопроса. Это только приводит к ненужной путанице ... –

0

Если вы хотите, чтобы ваш столбец в представлении был непустым, тогда внутреннее соединение с таблицей, содержащей этот столбец, в качестве первичного ключа и выберите (в данном случае) PERSON_ID из этой таблицы в определении представления. Это решает проблему.