Oracle
 sql >> Database >  >> RDS >> Oracle

Come creare una colonna non nulla in una vista

Non è possibile aggiungere un vincolo not null o check a una vista; vedere questo e nella stessa pagina "Restrizioni sui vincoli NON NULL" e "Restrizioni sui vincoli di controllo". Puoi aggiungere un with check option (contro una clausola where ridondante) alla vista ma non verrà contrassegnata come not null nel dizionario dei dati.

L'unico modo in cui posso pensare di ottenere questo effetto è, se sei su 11g, aggiungere il valore di cast come colonna virtuale sul tavolo e (se è ancora necessario) creare la vista su quello:

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

Dato che hai detto in un commento su dba.se che questo serve per prendere in giro qualcosa, potresti usare una colonna normale e un trigger per simulare la colonna virtuale:

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

E desc "MyView" dà ancora:

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

Come accennato da Leigh (anche su dba.se), se volevi inserire/aggiornare la vista potresti usare un instead of trigger, con la versione VC o fake.