CREATE OR REPLACE TYPE TYPE_OBJECT AUTHID CURRENT_USER AS OBJECT
(
-- Attributes
object_type_name VARCHAR2(100)
-- Member functions and procedures
, MEMBER PROCEDURE DBMS_OUTPUT
, MEMBER FUNCTION TO_STRING RETURN VARCHAR2
, MEMBER FUNCTION TO_CLOB RETURN CLOB
, MEMBER FUNCTION compare(in_type1 TYPE_OBJECT, in_type2 TYPE_OBJECT) RETURN INTEGER
, ORDER MEMBER FUNCTION compare2(in_other TYPE_OBJECT) RETURN INTEGER
) NOT FINAL NOT INSTANTIABLE
/
CREATE OR REPLACE TYPE BODY TYPE_OBJECT
IS
MEMBER PROCEDURE DBMS_OUTPUT
IS
BEGIN
SYS.DBMS_OUTPUT.PUT_LINE(SELF.TO_STRING());
END;
------------------------------------------
MEMBER FUNCTION TO_STRING RETURN VARCHAR2
IS
BEGIN
RETURN SYS.XMLTYPE(SELF).extract('/').getStringVal() ;
EXCEPTION
WHEN OTHERS THEN
RETURN 'ERROR : ' SQLERRM;
END;
------------------------------------------
MEMBER FUNCTION TO_CLOB RETURN CLOB
IS
BEGIN
RETURN SYS.XMLTYPE(SELF).extract('/').getCLOBVal() ;
EXCEPTION
WHEN OTHERS THEN
RETURN 'ERROR : ' SQLERRM;
END;
------------------------------------------
MEMBER FUNCTION compare(in_type1 TYPE_OBJECT, in_type2 TYPE_OBJECT) RETURN INTEGER
IS
BEGIN
RETURN 1; -- default always not equal
END;
------------------------------------------
ORDER MEMBER FUNCTION compare2(in_other TYPE_OBJECT) RETURN INTEGER
IS
BEGIN
RETURN SELF.compare(SELF,in_other);
END;
END;
/
Merkmale:
- AUTHID CURRENT_USER ist notwendig, um das TYPE_OBJECT auch von anderen Schemata vererben zu können. Damit haben alle abgeleiteten Types auch die AUTHID CURRENT_USER Berechtigung vererbt.
- Attribut object_type_name ist notwendig, weil Oracle kein Interface kennt und für die Type-Deklaration mindestens ein Attribut vorhanden sein muss.
- SYS.XMLTYPE(SELF).extract('/') repräsentiert einzelne Attribute in XML-Format mit Zeilenumbruch. Für die Types, die XML-Type- oder XML-String-Attribute beinhalten, können die TO_STRING und TO_CLOB Methoden auf eigene Art überschrieben werden, um den Inhalt richtig zu repräsentieren.
- Da sich die ORDER- oder MAP-Methode des Types nicht überschreiben läßt, wird für Vergleichszwecke eine COMPARE-Methode definiert, die default immer "ungleich" liefert.
Im Typevergleich-Bedarfsfall muß man die COMPARE-Methode in den vererbten Type überschreiben. - Für das Ersetzen des TYPE_OBJECT muß man diesen erst mit DROP TYPE TYPE_OBJECT FORCE; löschen und im Anschuß die invaliden Objekte kompilieren.