Erstellen Sie eine Objekttabelle mit type with suptype attribute

9

Ich versuche, eine Oracle-Tabelle des Oracle-Objekttyps zu erstellen.

So sieht meine Objektstruktur aus

%Vor%

All das ist in Ordnung, aber was, wenn ich versuche, eine Tabelle von EMP_T type mit

zu erstellen %Vor%

Ich erhalte Fehler

%Vor%

Ist es in Orakel möglich, eine Tabelle wie diese zu erstellen?

    
Suganthan Madhavan Pillai 19.04.2016, 15:31
quelle

2 Antworten

2

Ich glaube nicht. Laut Oracle's eigener Support-Datenbank gilt das Folgende für eine ora-30756:

  

Fehlertext, Ursache und Maßnahme aus Meldungsdatei / en für ORA-30756

     

Versionen 9.2, 10.1, 10.2, 11.1, 11.2, 12.1

     

Fehler: ORA-30756 kann keine Spalte oder Tabelle eines Typs erstellen, der ein Supertype-Attribut

enthält      

Ursache: Der Benutzer hat versucht, eine Spalte oder Tabelle eines Objekttyps zu erstellen     enthält ein Übertyp-Attribut. Dies wird nicht unterstützt, weil es dazu führt     zu unendlicher Rekursion in unserem aktuellen Speichermodell. Beachten Sie, dass das Erstellen     Eine Spalte eines Typs bedeutet, dass wir Spalten erstellen, die allen entsprechen     Subtyp-Attribute auch.   Aktion: Ändern Sie die Typdefinition so, dass sie ein Supertyp REF-Attribut enthält     anstelle des Obertypobjektattributs.

Sie haben einen Super-Typ PERS_T erstellt, also glaube ich, dass dies Ihr Problem ist. Wie der Artikel sagt, können Sie ein Referenzattribut anstelle eines Objektattributs als Umgehung erstellen, wie @tbone erklärt - CREATE TABLE tabellenname (emp_type REF EMP_T);

    
Rob Mascaro 09.05.2016, 08:00
quelle
0

Sie dürfen eine IS-A Beziehung nicht unter Verwendung des UNDER -Schlüsselwortes gleichzeitig mit einer HAS-A Beziehung unter Verwendung desselben Typs unterschreiben. Dies führt letztendlich dazu, dass ein Objekt erstellt wird, das auf sich selbst verweist und zu einer unendlichen Rekursion führen würde. Sie können stattdessen einen Zeiger auf das Objekt desselben Typs in Ihrem Code verwenden, indem Sie REF wie folgt verwenden:

%Vor%

IS-A- und HAS-A-Beziehungen in Oracle-Vererbung

IS-A- und HAS-A-Beziehungen ermöglichen sowohl die Polymorphie als auch die Wiederverwendbarkeit von Code, aber sie definieren grundlegend unterschiedliche Beziehungen zwischen zwei Typen.

IS-A

Das Schlüsselwort UNDER soll Beziehungen unter Verwendung des IS-A-Vererbungsmodells unterteilen. Beispiel: employee IS-A person mit einem emp_id wie definiert mit:

%Vor%

Die Idee ist, dass ein Objekt von employee_type auch ein Objekt von person_type ist, aber mit der zusätzlichen Angabe von emp_id . Dies ermöglicht das Vererbungsmodell des Polymorphismus, indem die Wiederverwendung von Code durch Erweiterung des person_type Supertyps ermöglicht wird. Beachten Sie, dass es immer möglich ist, eine andere Erweiterung von person_type student wie folgt zu definieren:

%Vor%

HAS-A

Daher erzwingt Oracle bei der Erstellung eines zusammengesetzten Untertyps keine Schlüsselwörter. Es ist nicht syntaktisch ungeeignet, einen Untertyp, der einen oder mehrere Supertypen enthält, so frei wie andere native Typen zu definieren. Es ist beispielsweise zulässig, einen zusammengesetzten Untertyp classroom_type zu definieren, indem Sie ihn mit einem teacher vom Typ person , 3 Schülern vom Typ person sowie einer Raumnummer vom Typ number so zusammensetzen wie:

%Vor%

Die HAS-A-Beziehung besteht zwischen zwei Objekten, wenn ein Objekt zu gehört, d. h. das vorherige Objekt besteht aus dem letzteren.

Diese Vorgehensweise kann jedoch zu unnötiger Replikation großer Objekte führen, wenn Sie die Daten von einem Ort zum anderen kopieren. Um die Dinge effizienter zu machen, ähnlich wie beim Referenzieren in der Programmierung , Mit dem Modifikator " REF " können Sie einen Zeiger an ein Objekt übergeben, der in verschiedenen Szenarios einschließlich zusammengesetzter Untertypen verwendet werden kann. Daher kann die obige DDL des class_type wie folgt umgeschrieben werden:

%Vor%

und ist viel effizienter. Es ist hilfreich zu wissen, dass Änderungen am referenzierten Objekt automatisch downstream propagiert werden.

In dem Beispiel in der Frage möchte OP sowohl eine IS-A-Beziehung als auch eine HAS-A-Beziehung gleichzeitig verwenden, wie in

%Vor%

was eine faire Übersetzung eines realen Konzepts ist. Um es jedoch legal zu machen, ohne zu unendlicher Rekursion zu führen, modifizieren wir es als:

%Vor%     
Spade 09.05.2016 19:49
quelle

Tags und Links