web-dev-qa-db-ja.com

Oracle:ビューにnull以外の列を作成する方法

次のようなテーブルがあるとします。

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」としてマークするように強制する方法はありますか?

3
Danny Varod

今私が理解しているように、テーブルを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
3
Leigh Riffel