So erstellen Sie eine Nicht-Null-Spalte in einer Ansicht

8

Gegeben eine Tabelle wie:

%Vor%

Ich möchte eine Ansicht erstellen wie:

%Vor%

Nur dort, wo die Spalte "MyColumn" "NOT NULL" ist.

In SQL Server ist das ziemlich einfach:

%Vor%

Allerdings führt das Oracle-Äquivalent zu einer "NULL" -Spalte:

%Vor%

Gibt es trotzdem eine Anforderung, Oracle zu zwingen, die Spalte der Ansicht als "NICHT NULL" in den Metadaten zu markieren?

    
Danny Varod 19.06.2012, 09:08
quelle

2 Antworten

6

Sie können einer Ansicht keine Nicht-Null- oder Prüfbedingung hinzufügen. siehe dies und auf derselben Seite "Einschränkungen für NOT NULL Constraints" und "Beschränkungen für Prüfbeschränkungen". Sie können der Ansicht ein with check option (für eine redundante where-Klausel) hinzufügen, das jedoch nicht im Datenwörterbuch als not null markiert ist.

Der einzige Weg, wie ich diesen Effekt erzielen kann, ist, wenn Sie auf 11g sind, den Cast-Wert als virtuelle Spalte in der Tabelle hinzuzufügen und (falls es noch benötigt wird) die Ansicht dagegen zu erstellen:

%Vor%

Da Sie in einem Kommentar auf dba.se gesagt haben, dass dies etwas zum Nachdenken bringt, könnten Sie eine normale Spalte und einen Trigger verwenden, um die virtuelle Spalte zu simulieren:

%Vor%

Und desc "MyView" gibt immer noch:

%Vor%

Wie Leigh erwähnt hat (auch auf dba.se), wenn Sie die Ansicht einfügen / aktualisieren wollten, könnten Sie einen instead of Trigger verwenden, mit der VC oder gefälschten Version.

    
Alex Poole 19.06.2012, 10:03
quelle
1

Wenn eine NOT NULL-Einschränkung für eine View-Spalte haben könnte, würde ich glauben, dass ein SELECT aus der View dann fehlschlagen würde, wenn die fragliche Spalte NULL wäre. Wenn dies die Absicht ist, dann könnte das Folgende Ihnen geben, wonach Sie suchen:

%Vor%

Nicht sehr attraktiv, und Sie erhalten eine hässliche "ORA-01476: Division ist gleich Null" Nachricht, wenn der ELSE-Zweig der CASE genommen wird, aber vielleicht ist es ein Schritt auf dem Weg zu "besser".

Teilen und genießen.

BEARBEITEN: Wenn das Ziel darin besteht, nur Zeilen aufzunehmen, bei denen Ihre Zielspalte nicht null ist, könnten Sie Ihrer Ansicht eine WHERE-Klausel hinzufügen, wie in:

%Vor%

YMMV.

EDIT2: Wenn Sie das SQL Server-Beispiel betrachten, scheint es, dass die ISNULL-Funktion verwendet wird, um sicherzustellen, dass die Spalte niemals NULL ist. Wenn dies akzeptabel ist, können Sie Folgendes tun:

%Vor%

Um Bullwinkle zu zitieren: "Dieses Mal sicher!" : -)

    
Bob Jarvis 19.06.2012 10:58
quelle

Tags und Links