250 likes | 354 Views
Oracle – ORDMS lehetőségek. UDT: - objektum típusok - kollekció típusok. SQL> CREATE TYPE SZEMELY AS OBJECT ( 2 NEV VARCHAR2(20), 3 TEL VARCHAR2(14));. SQL> CREATE TABLE MUNKA (LEIRAS CHAR(20), FELELOS SZEMELY); SQL> INSERT INTO MUNKA VALUES ('PROBA MUNKA',
E N D
Oracle – ORDMS lehetőségek UDT: - objektum típusok - kollekció típusok SQL> CREATE TYPE SZEMELY AS OBJECT ( 2 NEV VARCHAR2(20), 3 TEL VARCHAR2(14)); SQL> CREATE TABLE MUNKA (LEIRAS CHAR(20), FELELOS SZEMELY); SQL> INSERT INTO MUNKA VALUES ('PROBA MUNKA', SZEMELY('PETER','123')); SQL> SELECT * FROM MUNKA LEIRASFELELOS(NEV, TEL) -------------------------------------------------------------------------------- PROBA MUNKASZEMELY('PETER', '123')
Alias név használata kötelező objektum attribútum hivatkozásoknál SQL> SELECT * FROM MUNKA M WHERE M.FELELOS.NEV LIKE 'PETER%'; SQL> SELECT M.FELELOS.NEV FROM MUNKA M; FELELOS.NEV -------------------- PETER SELECT FELELOS FROM MUNKA; ok SELECT FELELOS.NEV FROM MUNKA; nem SELECT MUNKA.FELELOS.NEV FROM MUNKA; nem SELECT M.FELELOS.NEV FROM MUNKA M; ok
Objektum tábla SQL> CREATE TABLE SZEMELYEK OF SZEMELY; SQL> INSERT INTO SZEMELYEK VALUES ('ANNA','3424'); SQL> SELECT NEV FROM SZEMELYEK WHERE TEL LIKE '3424%'; NEV -------------------- ANNA INSERT INTO SZEMELYEK VALUES(NULL) nem INSERT INTO SZEMELYEK VALUES(SZEMELY(NULL,NULL)) ok
Objektum view SQL> CREATE TYPE NEZET AS OBJECT ( 2 NEV CHAR(30), 3 FIZ NUMBER(3)); SQL> CREATE VIEW V OF NEZET WITH OBJECT IDENTIFIER (NEV) AS SELECT M.FELELOS.NEV NEV, M.FIZETES FROM MUNKA M; SQL> SELECT * FROM V; NEV FIZ -------------------- ---------- PETER 200 SQL> CREATE VIEW V2 (F1,F2) AS SELECT M.LEIRAS, NEZET(M.FELELOS.NEV, M.FIZETES) FROM MUNKA M; SQL> SELECT V.F1, AVG(V.F2.FIZ) FROM V2 V GROUP BY V.F1;
SELECT kifejezések szabadabb használata SQL> SELECT LEIRAS, (SELECT MAX(FIZETES) FROM MUNKA) FROM MUNKA; ok SQL> SELECT MAX(SELECT FIZETES FROM MUNKA) FROM DUAL; hiba SQL> SELECT MAX(AFIZ) FROM (SELECT LEIRAS, AVG(FIZETES) AFIZ FROM MUNKA GROUP BY LEIRAS); ok SQL> INSERT INTO MUNKA VALUES ('PROBA',NULL, (SELECT MAX(FIZETES) + 1 FROM MUNKA)); 1 sor létrejött. ok SQL> CREATE ASSERTION A1 CHECK (SELECT MAX(FIZETES) FROM MUNKA) > 100); hiba SQL> UPDATE MUNKA SET FIZETES = (SELECT MIN(FIZETES) FROM MUNKA) WHERE FIZETES < 150; ok
Tábla típus SQL> CREATE TYPE NYELV AS OBJECT ( NYNEV CHAR(20), SZINT NUMBER(1)); SQL> CREATE TYPE NYELVEK AS TABLE OF NYELV; SQL> ALTER TABLE MUNKA ADD (NYSZINT NYELVEK) NESTED TABLE NYSZINT STORE AS NYTABLA;
Tábla típus SQL> INSERT INTO MUNKA VALUES ('UJABB', SZEMELY('KATI','3462'),301, NYELVEK( NYELV('ANGOL',1),NYELV('NEMET',2))); SQL> SELECT * FROM TABLE(SELECT NYSZINT FROM MUNKAWHERE LEIRAS='UJABB'); NYNEV SZINT -------------------- ---------- ANGOL 1 NEMET 2 SQL> INSERT INTO TABLE(SELECT NYSZINT FROM MUNKA WHERE LEIRAS='UJABB') VALUES ('FINN',3); SQL> UPDATE TABLE(SELECT NYSZINT FROM MUNKA WHERE LEIRAS='UJABB') SET SZINT = 4 WHERE NYNEV = 'FINN';
Objektum azonosítás, hivatkozás objektum azonosítás (OID) : - rendszer által generált - kulcsból képzett indexelt hivatkozás : REF() SQL> CREATE TYPE AUTO AS OBJECT ( RSZ CHAR(6), TULAJ REF SZEMELY); SQL> CREATE TABLE AUTOK OF AUTO; SQL> SELECT P.NEV, REF(P) FROM SZEMELYEK P; NEV REF(P) ------------------------------------------------------------------- ANNA0000280209447BAB1EDDE24A5886E9 C64B6BC741586786A61E89134C158795B6AE6 A5152000040C5820000
Objektum hivatkozás SQL> INSERT INTO AUTOK VALUES('R11',(SELECT REF(P) FROM SZEMELYEK P WHERE P.NEV='ZOLI')); SQL> SELECT * FROM AUTOK; RSZTULAJ --------------------------------------------------------------- R11000022020884E1C92BF87047A48E8D41C…. SQL> SELECT A.RSZ, A.TULAJ.NEV FROM AUTOK A; RSZ TULAJ.NEV ------ -------------------- R11 ZOLI SQL> CREATE TYPE CSOPREF AS TABLE OF REF SZEMELY; SQL> ALTER TYPE AUTO ADD ATTRIBUTE UTASOK CSOPREF CASCADE;
Objektum hivatkozás SQL> UPDATE AUTOK SET UTASOK = CSOPREF ((SELECT REF(S) FROM SZEMELYEK S WHERE S.NEV = 'ANNA'),(SELECT REF(S) FROM SZEMELYEK S WHERE S.NEV = 'PETER')); SQL> SELECT * FROM AUTOK; RSZ TULAJ UTASOK --------------------------------------------------------------- R11 000022020 CSOPREF(0000220208447B.. SQL> SELECT A.RSZ, A.TULAJ.NEV, A.UTASOK.NEV FROM AUTOK A; hiba SQL> SELECT P.UTASOK FROM AUTOK P; UTASOK ---------------------------------------------------------------- CSOPREF(00002202084…, 0000220208A49BC… )
Objektum hivatkozás SQL> SELECT * FROM TABLE(SELECT UTASOK FROM AUTOK); COLUMN_VALUE -------------------------------------------------------------- 0000220208447BAB1EDDE24A5886E9C64B6BC7415 0000220208A49BCCF9F8874A1DB7F287F8D315B57 SQL> SELECT P.COLUMN_VALUE.NEV FROM TABLE(SELECT UTASOK FROM AUTOK) P; COLUMN_VALUE.NEV -------------------- ANNA PETER
ADT öröklés az öröklés nem támogatott teljes mértékben SQL> CREATE TYPE EMBER AS OBJECT ( NEV VARCHAR2(20) ) NOT FINAL; SQL> CREATE TABLE T1 OF EMBER; SQL> INSERT INTO T1 VALUES('PETER'); SQL> CREATE TYPE DIAK UNDER EMBER ( ATLAG NUMBER(4,2) ); SQL> CREATE TABLE T2 OF DIAK; SQL> INSERT INTO T2 VALUES ('ZOLI',2.3);
ADT öröklés SQL> SELECT * FROM T2; NEV ATLAG -------------------- ---------- ZOLI 2.3 SQL> SELECT * FROM T1; NEV -------------------- PETER
Metódusok implementáció : PL/SQL, Java, C++,.. típus : objektum, osztály szint megadás : deklaráció, definíció SQL> CREATE TYPE EMBER AS OBJECT ( NEV CHAR(20), MEMBER FUNCTION GET_NEV RETURN CHAR ); SQL> CREATE TYPE BODY EMBER AS MEMBER FUNCTION GET_NEV RETURN CHAR IS BEGIN RETURN SELF.NEV; END; END;
Metódusok SQL> CREATE TABLE T1 OF EMBER; SQL> INSERT INTO T1 VALUES('PETER'); SQL> SELECT P.GET_NEV() FROM T1 P; P.GET_NEV() ----------------------------------- PETER SQL> CREATE TYPE EMBER AS OBJECT ( 2 NEV CHAR(20), 3 MEMBER FUNCTION GET_NEV RETURN CHAR, 4 MEMBER PROCEDURE SET_NEV(UN IN CHAR) 5 );
Metódusok SQL> CREATE TYPE BODY EMBER AS MEMBER FUNCTION GET_NEV RETURN CHAR IS BEGIN RETURN SELF.NEV; END; MEMBER PROCEDURE SET_NEV (UN IN CHAR) IS BEGIN SELF.NEV := UN; END; END; SQL> CREATE TABLE T1 OF EMBER; SQL> INSERT INTO T1 VALUES('GABOR'); SQL> INSERT INTO T1 VALUES(‘ANNA');
Metódusok SQL> SELECT P.* FROM T1 P; NEV -------------------- ANNA GABOR SQL> SELECT REF(P) FROM T1 P; REF(P) ------------------------------------------------------------- 000028020992A57F97C14B4425A22249F….. 000028020914FF76ACCFC4428592784D7…. SQL> SELECT DEREF(REF(P)) FROM T1 P; DEREF(REF(P))(NEV) ---------------------------------------- EMBER('ANNA ') EMBER('GABOR ')
DECLARE CURSOR C1 IS SELECT REF(P) FROM T1 P; E1 REF EMBER; E EMBER; BEGIN OPEN C1; LOOP FETCH C1 INTO E1; EXIT WHEN C1%NOTFOUND; SELECT DEREF(E1) INTO E FROM DUAL; DBMS_OUTPUT.PUT_LINE(‘ NEV = ' || E.GET_NEV()); -- DEREF(E1).SET_NEV(‘ZOLI’) -- hiba END LOOP; CLOSE C1; END; SQL> SET SERVEROUTPUT ON
Metódusok SQL> UPDATE T1 T SET T = EMBER('GABI') WHERE NEV = 'GABOR'; DECLARE CURSOR C1 IS SELECT DEREF(REF(P)) FROM T1 P FOR UPDATE; E EMBER; BEGIN OPEN C1; LOOP FETCH C1 INTO E; EXIT WHEN C1%NOTFOUND; E.SET_NEV('ZOLI'); UPDATE T1 T SET T = E WHERE CURRENT OF C1 ; END LOOP; CLOSE C1; END;
Osztály metódusok SQL> CREATE TYPE DOBOZ AS OBJECT ( ELHOSSZ NUMBER(3), SZIN CHAR(20), STATIC FUNCTION DARAB(SZI IN CHAR) RETURN NUMBER ); SQL> CREATE TABLE DOBOZOK OF DOBOZ; SQL> CREATE TYPE BODY DOBOZ AS STATIC FUNCTION DARAB (SZI IN CHAR) RETURN NUMBER IS DB NUMBER; BEGIN SELECT COUNT(*) INTO DB FROM DOBOZOK WHERE SZIN = SZI; RETURN DB; END; END;
SQL> INSERT INTO DOBOZOK VALUES(DOBOZ(12,'KEK')); SQL> INSERT INTO DOBOZOK VALUES(DOBOZ(43,‘ZOLD’)); SQL> INSERT INTO DOBOZOK VALUES(DOBOZ(22,'KEK')); SQL> SELECT DOBOZ.DARAB('KEK') FROM DUAL; DOBOZ.DARAB('KEK') ------------------ 2
DROP TABLE KONYVEK1; DROP TABLE KIADOK1; CREATE TABLE KIADOK1 (KKOD NUMBER(3) PRIMARY KEY, NEV CHAR(20)); CREATE TABLE KONYVEK1 (KOD NUMBER(5) PRIMARY KEY, CIM CHAR(20),AR NUMBER(3), KIAD REFERENCES KIADOK1); DECLARE I NUMBER(5); BEGIN FOR I IN 1..1000 LOOP INSERT INTO KIADOK1 VALUES(I,'KIADO' || TO_CHAR(I)); END LOOP; END; COMMIT;
DECLARE I NUMBER(5); BEGIN FOR I IN 1..100000 LOOP INSERT INTO KONYVEK1 VALUES(I,'CIM' || TO_CHAR(I), NULL,MOD(I,100)+1); END LOOP; END; COMMIT; CREATE TYPE KIADO AS OBJECT ( KKOD NUMBER(3), NEV CHAR(20)); CREATE TYPE KONYV AS OBJECT ( KOD NUMBER(5), CIM CHAR(20), AR NUMBER(3), KIAD REF KIADO);
DECLARE I NUMBER(5); BEGIN FOR I IN 1..1000 LOOP INSERT INTO KIADOK2 VALUES(KIADO(I,'KIADO' || TO_CHAR(I))); END LOOP; END; DECLARE I NUMBER(5); E REF KIADO; BEGIN FOR I IN 1..100000 LOOP SELECT REF(T) INTO E FROM KIADOK2 T WHERE T.KKOD = MOD(I,100)+1; INSERT INTO KONYVEK2 VALUES(KONYV(I, 'CIM' || TO_CHAR(I),NULL,E)); END LOOP; END;
SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; CREATE VIEW V1 AS SELECT A.NEV, B.CIM FROM KIADOK1 A, KONYVEK1 B WHERE KIAD = KKOD; SELECT COUNT(*) FROM V1; SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; CREATE VIEW V2 AS SELECT A.CIM CIM ,A.KIAD.NEV NEV FROM KONYVEK2 A; SELECT COUNT(*) FROM V2; SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; HASONLÓ VÉGREHAJTÁSI IDŐK KB 1 SEC