Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak utworzyć niepustą kolumnę w widoku

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ą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje typ sygnatury czasowej automatycznej modyfikacji dla kolumn Oracle?

  2. Kiedy należy zagnieżdżać bloki PL/SQL BEGIN...END?

  3. Jak losowo pobrać rekordy z bazy danych Oracle?

  4. Październik 2014Procesor ulega awarii ArcGIS Desktop

  5. Wysyłanie tablicy wartości do procedury Oracle do użycia w klauzuli WHERE IN