鉴于类似的表:
CREATE TABLE "MyTable"
(
"MyColumn" NUMBER NOT NULL
);
我想创建像一个观点:
CREATE VIEW "MyView" AS
SELECT
CAST("MyColumn" AS BINARY_DOUBLE) AS "MyColumn"
FROM "MyTable";
只有在列“MyColumn”是“NOT NULL”。
在SQL Server中,这是相当直截了当:
CREATE VIEW [MyView] AS
SELECT
ISNULL(CAST([MyColumn] AS Float), 0.0) AS [MyColumn]
FROM [MyTable];
然而,在“NULL”列甲骨文相同的结果:
CREATE VIEW "MyView" AS
SELECT
NVL(CAST("MyColumn" AS BINARY_DOUBLE), 0.0) AS "MyColumn"
FROM "MyTable";
反正是有强制甲骨文视图的列标记为元数据中的“NOT NULL”?
您不能添加非空或检查约束的视图; 看到这与在同一页上和“关于检查约束限制”上NOT NULL约束限制“。 您可以添加一个with check option
(对冗余的where子句)的观点,但不会被标记为not null
数据字典。
我能想到的唯一办法让这种影响是,如果你是在11g中,以投增值作为餐桌上的虚拟列,并且(如果它仍然需要),创建针对该视图:
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
既然你在dba.se评论,这是对嘲讽的东西了说,你可以使用正常的列和触发模拟虚拟列:
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
而desc "MyView"
仍然给:
Name Null? Type
----------------------------------------- -------- ----------------------------
MyColumn NOT NULL BINARY_DOUBLE
由于利提到的(也dba.se),如果你确实想插入/更新,你可以使用一个视图instead of
触发,与VC或仿版。
如果你能有一个视图列NOT NULL约束我相信,从视图中选择将随后失败如果有问题的柱NULL。 如果是这样的意图那么下面可能给你,你找什么:
CREATE OR REPLACE VIEW some_view AS
SELECT some_field,
some_other_field,
CASE
WHEN field_of_interest IS NOT NULL
THEN CAST(field_of_interest AS BINARY_DOUBLE)
ELSE 1 / 0
END AS field_of_interest_not_null
FROM some_table;
不是非常有吸引力,你会得到一个丑陋的“ORA-01476:师等于零”如果案件的ELSE分支转移的消息,但也许这是道路上的一个步骤,以“更好”。
分享和享受。
编辑:如果目标是只能拿起行,其中你的目标列不为空,也许你可以在WHERE子句添加到您的看法,如:
CREATE OR REPLACE VIEW some_view AS
SELECT some_field,
some_other_field,
CAST(field_of_interest AS BINARY_DOUBLE) AS field_of_interest
FROM some_table
WHERE field_of_interest IS NOT NULL;
因人而异。
EDIT2:纵观SQL Server的例子,似乎正在使用ISNULL功能,保证列永远不能为null。 如果这是可以接受的,你可以做到以下几点:
CREATE OR REPLACE VIEW some_view AS
SELECT some_field,
some_other_field,
CAST(NVL(field_of_interest, 0.0) AS BINARY_DOUBLE) AS field_of_interest
FROM some_table
WHERE field_of_interest IS NOT NULL;
引述布温克尔,“这一次肯定FER !!!” :-)