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
Ich erhalte Fehler
%Vor%Ist es in Orakel möglich, eine Tabelle wie diese zu erstellen?
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ältUrsache: 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);
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:
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:
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:
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:
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:
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%Tags und Links oracle