次のようなテーブルがあるとします。
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];
ただし、Oracleの同等の結果は「NULL」列になります。
CREATE VIEW "MyView" AS
SELECT
NVL(CAST("MyColumn" AS BINARY_DOUBLE), 0.0) AS "MyColumn"
FROM "MyTable";
とにかく、Oracleにビューの列を「NOT NULL」としてマークするように強制する方法はありますか?
今私が理解しているように、テーブルをNOT NULL BINARY_DOUBLE
と見なすにはエンティティフレームワークが必要ですが、データはNOT NULL NUMBER
に格納されている必要があります。ビューにCAST
が含まれていると、ビューがNOT NULL
属性を渡さないため、ビューを使用するときにこれが問題になります。
オプションには、2つのアレックスプールが含まれます +1 SO(1.仮想列、2。トリガーを持つ異なるタイプの新しい列)または3.異なるタイプの列とトリガーを持つ新しいテーブル。これらのオプションは、それらが提示される順序。
前の回答
NOT NULL
とマークされているテーブルの列からのビューの列も、本質的にNOT NULL
になります。これを実現するために特別なことは必要ありません。
代わりに、テーブルがNOT NULL
とマークされているときにビューがnullを受け入れるようにする場合は、 INSTEAD OF
triggers を調べる必要があります。ビューにnullを挿入し、それをゼロとしてテーブルに挿入することができます。次に例を示します。
SQL> drop table t1;
Table dropped.
SQL>
SQL> drop view v1;
View dropped.
SQL>
SQL> create table t1 (c1 number not null);
Table created.
SQL>
SQL> insert into t1 values (1);
1 row created.
SQL>
SQL> insert into t1 values (null);
insert into t1 values (null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("LRIFFEL"."T1"."C1")
SQL>
SQL> create view v1 as select cast(c1 as binary_double) c1 from t1;
View created.
SQL>
SQL> insert into v1 values (2);
insert into v1 values (2)
*
ERROR at line 1:
ORA-01733: virtual column not allowed here
SQL>
SQL> insert into v1 values (null);
insert into v1 values (null)
*
ERROR at line 1:
ORA-01733: virtual column not allowed here
SQL>
SQL> CREATE TRIGGER TRIGGER1
2 INSTEAD OF INSERT ON V1
3 REFERENCING OLD AS old NEW AS new
4 BEGIN
5 INSERT INTO t1 VALUES (NVL(:new.c1,0));
6 END;
7 /
Trigger created.
SQL>
SQL> insert into v1 values (2);
1 row created.
SQL>
SQL> insert into v1 values (null);
1 row created.
SQL>
SQL> select * from t1;
C1
----------
1
2
0