User Defined Type (UDT) adattípusok az Oracle 10g-ben ----------------------------------------------------- Metódusok --------- Az objektumoknak nem csak attribútumai, hanem metódusai is lehetnek. A metódusok túlterhelhetők (overload), lásd az alábbi példát. CREATE OR REPLACE TYPE PointType AS OBJECT (x NUMBER, y NUMBER ); CREATE OR REPLACE TYPE LineType AS OBJECT ( end1 PointType, end2 PointType, hossz NUMBER, MEMBER FUNCTION getLength(scale IN NUMBER) RETURN NUMBER, MEMBER FUNCTION getLength RETURN NUMBER, MEMBER PROCEDURE setLength, PRAGMA RESTRICT_REFERENCES(getLength, WNDS) ); CREATE OR REPLACE TYPE BODY LineType AS MEMBER FUNCTION getLength(scale NUMBER) RETURN NUMBER IS BEGIN RETURN scale * SQRT((SELF.end1.x-SELF.end2.x)*(SELF.end1.x-SELF.end2.x) + (SELF.end1.y-SELF.end2.y)*(SELF.end1.y-SELF.end2.y)); END; MEMBER FUNCTION getLength RETURN NUMBER IS BEGIN RETURN SELF.hossz; END; MEMBER PROCEDURE setLength IS BEGIN SELF.hossz := SQRT((SELF.end1.x-SELF.end2.x)*(SELF.end1.x-SELF.end2.x) + (SELF.end1.y-SELF.end2.y)*(SELF.end1.y-SELF.end2.y)); END; END; CREATE TABLE Lines (lineID INT, line LineType); INSERT INTO Lines VALUES(1, LineType(PointType(0.0, 0.0), PointType(3.0, 4.0),null)); INSERT INTO Lines VALUES(2, LineType(PointType(0.0, 0.0), PointType(6.0, 6.0),null)); A metódusok közül a függvényeket SQL utasításban is lehet használni, a procedúrát viszont csak plsql-ben, mint ahogy ez a hagyományos procedúrákkal is így van. DECLARE v_line LineType; BEGIN SELECT line INTO v_line FROM lines WHERE lineID=1; v_line.setLength; UPDATE lines SET line = v_line WHERE lineID=1; COMMIT; END; SELECT lineid, l.line.getLength() FROM lines l; LINEID L.LINE.GETLENGTH() ------ ------------------ 1 5 2 SELECT lineid, l.line.getLength(1) FROM lines l; LINEID L.LINE.GETLENGTH(1) ------ ------------------- 1 5 2 8,4853 A metódusokról is kaphatunk információkat a katalógusból, vagy a korábban már említett DBA_TYPE_METHODS, DBA_METHOD_PARAMS, DBA_METHOD_RESULTS szótárakból vagy pedig az alábbi sokkal kényelmesebb módon. SELECT text FROM dba_type_versions WHERE type_name='LINETYPE' ORDER BY line; TEXT ------------------------------------------------------------- TYPE LineType AS OBJECT ( end1 PointType, end2 PointType, hossz NUMBER, MEMBER FUNCTION getLength(scale IN NUMBER) RETURN NUMBER, MEMBER FUNCTION getLength RETURN NUMBER, MEMBER PROCEDURE setLength, PRAGMA RESTRICT_REFERENCES(getLength, WNDS) ); Néhány további információ az objektumokról és metódusokról ---------------------------------------------------------- Öröklés: CREATE TYPE Address_t AS OBJECT(...) NOT INSTANTIABLE NOT FINAL; CREATE TYPE USAddress_t UNDER Address_t(...); Final -> nem lehet örökölni Egy metódus a következő kategóriákba eshet: MEMBER - csak konkrét objektumra alkalmazható, van egy implicit SELF paramétere STATIC - nem kell hozzá példány, hanem típusnév.f1 formában hívható COMPARISON - MAP (egy számmal tér vissza) vagy ORDER (két objektumot hasonlít össze) Példa az utóbbi kettőre: CREATE TYPE rectangle_typ AS OBJECT ( len NUMBER, wid NUMBER, MAP MEMBER FUNCTION area RETURN NUMBER ); CREATE TYPE BODY rectangle_typ AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN len * wid; END area; END; CREATE TYPE location_typ AS OBJECT ( building_no NUMBER, city VARCHAR2(40), ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER ); CREATE TYPE BODY location_typ AS ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS BEGIN IF building_no < l.building_no THEN RETURN -1; -- any negative number will do ELSIF building_no > l.building_no THEN RETURN 1; -- any positive number will do ELSE RETURN 0; END IF; END; END; A metódusokra szintén megadható a FINAL. Ez azt jelenti, hogy az altípus nem írhatja felül őket. CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), FINAL MAP MEMBER FUNCTION get_idno RETURN NUMBER) NOT FINAL;