programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Egendefinerade typer i Oracle

1. Egendefinierade typer
2. Exempeltyp TADDRESS
3. REF

1. Egendefinierade typer

I Oracle kan man definiera sina egna datatyper med följande syntax:
CREATE [OR REPLACE] TYPE typnamn AS OBJECT(
	kolumnnamn DATATYP
	[, kolumnnamn DATATYP ...]
);
/

2. Exempeltyp TADDRESS

Nu ska vi skapa en typ TADDRESS som innehåller adresser:
SQL> CREATE TYPE taddress AS OBJECT(
	street VARCHAR(100),
	zip CHAR(5),
	city VARCHAR(50)
);
/

Typ är skapad.

Märk att man måste lägga till ett slash (/) för att få satsen att köra.

3. REF

En referens REF är en datatyp som kallas för Object Identifier (OID). En referens är en pekare (som i C) som ligger som en kolumn i tabellen. Kolumnen har följande syntax:
kolumnnamn REF egendef_typ SCOPE IS objektsamling
Här ser vi att förutom att kolumnen ska ha ett namn måste även två övriga delar finnas:

  • egendef_typ: Den egendefinierade typen som ska pekas på.
  • objektsamling: Namnet på den samling innehållande möjliga objekt som referensen kan peka på. Referensen kan inte peka på något objekt som inte finns i samlingen.
Vi kan införa en referens i tabellen EMP som ska peka på en adress. Men vi måste alltså först ha en objektsamling för vår nya typ, där det faktiska datat kan lagras. Detta är lätt ordnat, vi skapar en tabell ADDRESSES:
SQL> CREATE TABLE addresses OF taddress;

Tabellen är skapad.

Vi lägger till en adress i ADDRESSES:
SQL> INSERT INTO addresses VALUES('Senapsvägen 12a','70213','Örebro');

1 rad är skapad.

Nu kan vi lägga till referenskolumnen i EMP:
SQL> ALTER TABLE emp ADD ( address_ref REF taddress SCOPE IS addresses);

Tabell är ändrad.

SQL> DESC emp;
 Namn                                      Null?    Typ
 ----------------------------------------- -------- ----------------------------
 EMP_PK                                             NUMBER(10)
 DEP_PK                                             NUMBER(10)
 FIRST_NAME                                         VARCHAR2(100)
 LAST_NAME                                          VARCHAR2(100)
 SALARY                                             NUMBER(10)
 ID_NR                                              CHAR(10)
 ADDRESS_REF                                        REF OF TADDRESS

Här ser vi att referensen har lagts till i tabellstrukturen. Än så länge är alla referenser NULL-pekare:
SQL> set NULL NULL
SQL> SELECT * FROM emp;


EMP_PK DEP_PK FIRST_NAME LAST_NAME         SALARY ID_NR      ADDRESS_REF
------ ------ ---------- ------------- ---------- ---------- ----------------------------------------
     1      1 Janne      Svensson           50000 6712123223 NULL
     2      2 Olle       Kullberg           21000 7402191212 NULL
     3      2 Per        Johansson          23000 7507120101 NULL
     4      2 Magnus     Magnusson          32000 6609121101 NULL
     5 NULL   Karl       Alp                    0 NULL       NULL
     6 NULL   Bertil     Svensson               0 NULL       NULL

6 rader.

Nu uppdaterar vi en av raderna så att ADDRESS_REF pekar på en adress i tabellen ADDRESSES:
SQL> UPDATE emp
SET address_ref=(
	SELECT REF(a) 
	FROM addresses a
	WHERE a.city='Örebro'
	)
WHERE last_name='Kullberg';

1 rad är uppdaterad.

Så långt frid och fröjd. Vi såg att funktionen REF() används för att komma åt pekaren till den aktuella raden. Nu är frågan, hur kommer man åt själva datat? Om man bara tittar på innehållet i tabellen EMP ser man bara pekarvärdet:
SQL> SELECT * FROM emp;

EMP_PK DEP_PK FIRST_NAME LAST_NAME         SALARY ID_NR      ADDRESS_REF
------ ------ ---------- ------------- ---------- ---------- ----------------------------------------
     1      1 Janne      Svensson           50000 6712123223 NULL
     2      2 Olle       Kullberg           21000 7402191212 00002202084680919CD003467F9FB17746224C1D
                                                             9C7DA7695F03A947E7ADB6A3EE5D46FFBD

     3      2 Per        Johansson          23000 7507120101 NULL
     4      2 Magnus     Magnusson          32000 6609121101 NULL
     5 NULL   Karl       Alp                    0 NULL       NULL
     6 NULL   Bertil     Svensson               0 NULL       NULL

6 rader.

Det är först genom att utnyttja funktionen DEREF() som man kan komma åt datat:
SQL> SELECT DEREF(address_ref) FROM emp;

DEREF(ADDRESS_REF)(STREET, ZIP, CITY)
------------------------------------------------------------------------------------------------------------------

NULL
TADDRESS('Senapsvägen 12a', '70213', 'Örebro')
NULL
NULL
NULL
NULL

6 rader.