Objekt-relationales Datenbanksystem Oracle 1 Benutzerdefinierte Datentypen 1.1 Unvollständige Typen create-incomplete-type - CREATE - TYPE - type-name - ; - OR - REPLACE 1.2 Kollektionstypen create-varray-type - CREATE - TYPE - type-name - OR - REPLACE - IS - AS - VARRAY - ( - limit - ) - VARYING - ARRAY - OF - datatype - ; create-nested-table-type - TYPE - type-name - CREATE - OR - REPLACE - IS - AS - TABLE - OF - datatype - ; 1 1.3 Objekttypen create-object-type - CREATE - TYPE - type-name - OR - REPLACE - IS - AS - AUTHID - CURRENT_USER - UNDER - DEFINER - OBJECT - supertype - ( - attribute - datatype - ) - element-spec , - ; - FINAL - INSTANTIABLE - NOT - NOT element-spec - subprogram-clauses - - inheritance-clauses - map-order-function-spec 2 inheritance-clauses - OVERRIDING - FINAL - NOT - NOT - - INSTANTIABLE - NOT subprogram-clauses - MEMBER - STATIC - procedure-spec - function-spec map-order-function-spec - MAP - MEMBER - function-spec - ORDER - procedure-spec - PROCEDURE - name - - ( - parameter - datatype , - ) function-spec - FUNCTION - name - ( - parameter - datatype , - RETURN - datatype - ) - 3 create-type-body - CREATE - TYPE - BODY - type-name - OR - REPLACE - IS - AS - MEMBER - STATIC - procedure-declaration - function-declaration - MAP - MEMBER - function-declaration - ORDER - END - ; procedure-declaration - PROCEDURE - name - ( - parameter - datatype , - ) - IS - AS - pl/sql-block - function-declaration - FUNCTION - name - ( - parameter - datatype , - RETURN - datatype - ) - IS - AS - pl/sql-block 4 - 2 Objekttabellen create-object-table - CREATE - TABLE - table - OF - object-type - object-table-substitution - ( - object-properties - ) - ; - table-properties object-table-substitution - SUBSTITUTABLE - AT - ALL - LEVELS - NOT object-properties - column - attribute - DEFAULT - expr - - column-ref-constraint - column-constraint - table-or-view-constraint - table-ref-constraint table-properties - - column-properties - AS - subquery column-properties - object-type-col-properties - - nested-table–col-properties 5 object-type-col-properties - COLUMN - column - substitutable-column-clause - substitutable-column-clause - IS - OF - ( - ONLY - type - ) - ELEMENT - TYPE - SUBSTITUTABLE - AT - ALL - LEVELS - NOT nested-table–col-properties - NESTED - TABLE - nested-item - substitutable-column-clause - STORE - AS - storage-table - table-ref-constraint - SCOPE - FOR - ( - ref-column - ) - ref-attribute - - IS - scope-table-name - CONSTRAINT - contraint.name - FOREIGN - KEY - ( - ref-column - ref-attribute - ) - references-clause column-ref-constraint - SCOPE - IS - scope-table-name - CONSTRAINT - contraint.name - references-clause 6 3 Objektsichten create-object-view - VIEW - view - OF - type-name - CREATE - OR - REPLACE - WITH - OBJECT - IDENTIFIER - DEFAULT - ( - attribute , - UNDER - superview - ) - ) - ( - table-or-view-constraint - attribute - column-constraint , - AS - subquery - ; - subquery-restriction-clause 4 objekt-relationale Anfragen, Ausdrücke, etc. TABLE(collection-expression) [(+)] kann in einer FROM-Klausel verwendet werden, um auf kollektionswertige Attribute zuzugreifen. Die optionale Angabe von (+) funktioniert ähnlich wie bei einem outer join. COLUMN_VALUE ist der Spaltenname, der implizit für nested tables verwendet wird. DEREF(expr ) liefert zu einem referenzwertigen Ausdruck das zugehörige Objekt. Meist kann auf DEREF verzichtet werden, wenn man Pfadausdrücke verwendet, die mittels . gebildet werden (s. [2, Object Access Expressions]). REF(correlation-variable) liefert die Referenzen auf die Objekte der Tabelle, die durch den Tabellenalias (correlation-variable) bezeichnet wird. VALUE(correlation-variable) liefert die Objekte der Tabelle, die durch den Tabellenalias (correlation-variable) bezeichnet wird. Mit expr IS [NOT] DANGLING kann getestet werden, ob das durch den gegebenen Ausdruck 7 referenzierte Objekt existiert oder nicht. Mit expr IS [NOT] OF [TYPE] ([ONLY] type(, [ONLY] type)∗ ) kann getestet werden, ob ein Ausdruck von einem der angegeben Typen ist oder nicht. Mit TREAT(expr AS [REF] type) kann der Typ eines Ausdrucks in einen Ober- oder Untertyp geändert werden. Mit CAST(expr AS type-name) und auch mit CAST((subquery) AS type-name) kann ein Ausdruck von einem vordefinierten Typ in einen anderen konvertiert werden. Mit CAST(MULTISET(subquery) AS type-name) kann ein Anfrageergebnis in einen Mengentyp umgewandelt werden. Mit type-name(expr (, expr )∗ ) wird ein Konstruktor zu einem Objekttyp (type-name) aufgerufen. Neben einem implizit definierten Konstruktor zu jedem Objekttyp, kann man selbst weitere Konstruktoren definieren. Literatur [1] Oracle9i Database Concepts, Kapitel 14 und 15. [2] Oracle9i SQL Reference. [3] Oracle9i Application Developer’s Guide – Object-Relational Features. [4] PL/SQL User’s Guide and Reference. 8