Nie można dodać do widoku ograniczenia typu not null lub check; zobacz to i na tej samej stronie „Ograniczenia dotyczące ograniczeń NIEZEROWYCH” i „Ograniczenia dotyczące ograniczeń sprawdzania”. Możesz dodać with check option
(wobec nadmiarowej klauzuli WHERE) do widoku, ale nie zostanie to oznaczone jako not null
w słowniku danych.
Jedyny sposób, w jaki mogę pomyśleć, aby uzyskać ten efekt, to, jeśli korzystasz z 11g, dodaj wartość rzutowania jako wirtualną kolumnę na stole i (jeśli nadal jest to potrzebne) utwórz widok na podstawie tego:
ALTER TABLE "MyTable" ADD "MyBDColumn" AS
(CAST("MyColumn" AS BINARY_DOUBLE)) NOT NULL;
CREATE OR REPLACE VIEW "MyView" AS
SELECT
"MyBDColumn" AS "MyColumn"
FROM "MyTable";
desc "MyView"
Name Null? Type
----------------------------------------- -------- ----------------------------
MyColumn NOT NULL BINARY_DOUBLE
Ponieważ powiedziałeś w komentarzu na dba.se, że służy to do wyśmiewania czegoś, możesz użyć normalnej kolumny i wyzwalacza do symulacji kolumny wirtualnej:
CREATE TABLE "MyTable"
(
"MyColumn" NUMBER NOT NULL,
"MyBDColumn" BINARY_DOUBLE NOT NULL
);
CREATE TRIGGER "MyTrigger" before update or insert on "MyTable"
FOR EACH ROW
BEGIN
:new."MyBDColumn" := :new."MyColumn";
END;
/
CREATE VIEW "MyView" AS
SELECT
"MyBDColumn" AS "MyColumn"
FROM "MyTable";
INSERT INTO "MyTable" ("MyColumn") values (2);
SELECT * FROM "MyView";
MyColumn
----------
2.0E+000
I desc "MyView"
nadal daje:
Name Null? Type
----------------------------------------- -------- ----------------------------
MyColumn NOT NULL BINARY_DOUBLE
Jak wspomniał Leigh (również na dba.se), jeśli chcesz wstawić/zaktualizować widok, możesz użyć instead of
wyzwalacz, z wersją VC lub fałszywą.