Baze Podataka 2 Skripta

Embed Size (px)

Citation preview

  • 7/22/2019 Baze Podataka 2 Skripta

    1/53

    B, 2013.

    UNIVERZITET U BEOGRADUFAKULTET ORGANIZACIONIH NAUKA

    B 2

    A:

    . Z M. N A. S B

    M JM LS BE M

  • 7/22/2019 Baze Podataka 2 Skripta

    2/53

    2

    1. D ............................................................................................................................... 4

    1.1. P 2NF .................................................................................................... 5

    1.2. P 3NF (P) .............................................................................. 7

    1.3. P 3NF (S ) ................................................................. 9

    R .............................................................................................................................................. 11

    2. T ............................................................................................................................................ 12

    2.1. , .................................................... .................. 12

    2.2. P ............................................................................................................... 14

    2.3. P ........................................................................................................................ 15

    2.3.1. T O SUBP ................................................................................................. 16

    2.3.2. T M SQL S SUBP ......................................................................... 21

    2.3.3. T PSQL SUBP ......................................................................................... 24

    R .............................................................................................................................................. 25

    3. O ............................................................................................................. 26

    3.1. K .................................................................................................... 26

    3.1.1. S .............................................................................................................. 26

    3.1.2. D ..................................................................................................................... 31

    3.2. K ................................................................................................................ 33

    3.2.1. R ................................................................................................................ 33

    3.2.2. T ......................................................................................................................... 33

    3.2.3. V .......................................................................................................................... 34

    3.2.4. N .................................................................................................................. 34

    R .............................................................................................................................................. 36

  • 7/22/2019 Baze Podataka 2 Skripta

    3/53

    3

    4. O .................................................................................................................................. 37

    4.1. T ................................................ 37

    4.1.1. S D V ............................................................. 37

    4.1.2. R S D M ........................................... 40

    4.1.3. K D M ....................................................... 42

    4.1.4. H C V ...................................................... ............. 42

    4.2. I ................................................................................................................................... 43

    4.3. V ..................................................................................................... 45

    4.4. U P ........................................................................................................ 46

    4.4.1. P : A ............................................................ 46

    4.4.2. P : U ........................................... 49

    R .............................................................................................................................................. 53

  • 7/22/2019 Baze Podataka 2 Skripta

    4/53

    4

    1. D

    , . D ,

    .

    D ,

    . N , , ,

    , . Z

    ,

    , .

    (. ).

    U 2NF 3NF, PMOV

    . Z , . ,

    . P

    , . U

    DML .

    O :

    T T

    K P ?

    1 I DA (23 )

    U NED NE

    2 I NE

    U 1 DA

    2 NE

    3 DA

    D DA

    Tabela 1 - Opta struktura tabele specifikacije trigera

    K , . P

    DML , , ,

    DML , ,

    .

  • 7/22/2019 Baze Podataka 2 Skripta

    5/53

    5

    1.1. 2P 1:

    O , , . U ,

    (JOIN ) SQL

    , . K JOIN ,

    , NK K

    P (. , PMOV).

    :

    K , , P

    NK, K. O

    ,

    (. NK K

    P, , . , ). Z

    1Zbog preglednosti, na PMOV u nee biti prikazivani svi atributi entiteta niti sve njihove veze.

    Kupac(ifraKupca, NazivKupca, RaunKupca, TelefonKupca, FaksKupca,

    MatiniBroj, PIB, IDMesta)

    Porudbenica(ifraKupca, BrojPorudbenice, Datum, ifraRadnika)

    Kupac(ifraKupca, NazivKupca, RaunKupca, TelefonKupca, FaksKupca,

    MatiniBroj, PIB, IDMesta)

    Porudbenica(ifraKupca, BrojPorudbenice, Datum, NazivKupca,

    ifraRadnika)

  • 7/22/2019 Baze Podataka 2 Skripta

    6/53

    6

    ,

    DML .

    U , :

    I NK K. N P.

    D . N NK P,

    K .

    I NK P. O ,

    NK K.

    I K P, . P K P, ,

    , NK

    , .

    O

    . .

    S

    , (.

    ,

    ).

    T T

    K P ?

    I NE

    U NK DA

    P NK K, P.

    D NE

    I DA T NK K.

    UK DA

    T NK K.*

    NK DAZ .

    D NE

    * Ukoliko je uopte dozvoljeno auriranje kolone ifraKupca

  • 7/22/2019 Baze Podataka 2 Skripta

    7/53

    7

    V ( ,

    K) ( , P),

    , U

    , P

    P ( K, K).

    T, D . N, P :

    ifraKupca, BrojPorudbenice -> Datum, ifraRadnika

    P , P

    :

    ifraKupca, BrojPorudbenice -> Datum,NazivKupca, ifraRadnika

    ifraKupca ->NazivKupca

    O NK, P ,

    K, BP,

    (K),

    P. S ,

    P D .

    1.2. 3 ()

    P , P , T ,

    . P :

    KUPAC(ifraKupca, NazivKupca, PIB, DravaKupca, MestoKupca,

    AdresaKupca,TelefonKupca,FaxKupca)

    ZAHTEV(ifraZahteva, DatumZahteva, ifraValute, ifraMetodaIsporuke,ifraNainaPlaanja, ifraKupca)

  • 7/22/2019 Baze Podataka 2 Skripta

    8/53

    8

    K , Z K

    K Z. S ,

    , K, , .

    NK K, SQL JOIN

    . A , P ,

    NK Z. :

    :

    T T

    K P ?

    I NEU NK DA

    P NK K,

    Z.D NE

    I DA T NK K.

    UK DA

    T NK K.

    NK DAZ .

    D NE

    I P ,

    , T . N,

    Z :

    ifraZahteva -> DatumZahteva, ifraValute, ifraMetodaIsporuke,

    ifraNainaPlaanja, ifraKupca

    KUPAC(ifraKupca, NazivKupca, PIB, DravaKupca, MestoKupca,

    AdresaKupca,TelefonKupca,FaxKupca)

    ZAHTEV(ifraZahteva, DatumZahteva, ifraValute, ifraMetodaIsporuke,ifraNainaPlaanja, ifraKupca,NazivKupca)

  • 7/22/2019 Baze Podataka 2 Skripta

    9/53

    9

    P , Z :

    ifraZahteva -> DatumZahteva, ifraValute, ifraMetodaIsporuke,

    ifraNainaPlaanja, ifraKupca,NazivKupca

    ifraKupca ->NazivKupca

    M NK Z, K. S , Z T

    .

    1.3. 3 ( )U P

    D T . O

    , , T

    . P :

    M , ,

    . D , JOIN , .

    , SQL

    N G, D. K ,

    S , DID

    N, , N D. T

    :

    Naselje(NaseljeID, PotanskiBroj, Naziv, GradID)

    Grad(GradID, Naziv, DravaID)

    Drzava(DravaID, Naziv)

    Naselje(NaseljeID, PotanskiBroj, Naziv, GradID, DravaID)

    Grad(GradID, Naziv, DravaID)

    Drzava(DravaID, Naziv)

  • 7/22/2019 Baze Podataka 2 Skripta

    10/53

    10

    O ,

    N D G,

    .

    :

    T T K P ? I NE

    U DID DA U N G,

    DID N.

    D NE

    I DA U DID GID.

    U GID DA U DID

    GID

    DID DA S .D NE

    S ,

    T . N, N

    :

    NaseljeID -> PotanskiBroj, Naziv, GradID

    P , N :

    NaseljeID -> PotanskiBroj, Naziv, GradID,DravaID

    GradID -> DravaID

    M DID NID,

    GID. S , N T .

  • 7/22/2019 Baze Podataka 2 Skripta

    11/53

    11

    D . I

    , , .

    1. W M., M B.,I D E A, S,2007.

    2. M C., D A: C G ,A W, 2002.

    3. C T., B C., D : A ,P E L, 2004.

    4. L S., T T., N T., D D, M K, 2007.5. B S., .,D D: K , M K, 2009.6. P G.,B D D, W P, 2006.7. H J., P M., MF F., D , P E,

    2007.

    8. H S.,D , J W & S, 2002.

  • 7/22/2019 Baze Podataka 2 Skripta

    12/53

    12

    2. T

    . T ECA (E

    ) . O ,

    :

    D , SQL ,

    SQL . P INSERT, UPDATE DELETE.G DML (D M L)

    DML . N

    DDL (D D L) ,

    , . O DDL

    .

    D :

    2.1. , T . N

    , , :

    ( ). N ,

    . K

    . N

    PMOV , , . O , ,

    , .

  • 7/22/2019 Baze Podataka 2 Skripta

    13/53

    13

    N , . N

    ,

    ND. J N D, N. U ,

    .

    T , , ,

    TSQL . T

    .

    D . T

    :

    U ,

    U , ,

  • 7/22/2019 Baze Podataka 2 Skripta

    14/53

    14

    2.2.

    ://...

    F AFTER , , BEFORE . T BEFORE .T BEFORE . W BEFORE , , BEFORE , . T AFTER

    . T AFTER , , .

    T . B, BEFORE . T, :

    P A R

    BEFORE .

    C, .C, AFTER . A , AFTER . N . C, . F :

    P .

    P , , . N .

    I , INSTEAD OF . F , , INSERT INSTEAD OF INSERT .

  • 7/22/2019 Baze Podataka 2 Skripta

    15/53

    15

    2.3. T

    . U , :

    ( ) ( )

    S , SQL: 1999 FOR

    EACH STATEMENT.

    U ,

    , . U ,

    .

    U :

    O . T BEFORE . I , BEFORE (FOR EACH ROW).

    O , . O , ,

    . O AFTER (FOR EACH ROW FOR EACHSTATEMENT)

    INSTEAD OF FOR EACH ROW, . N , , .

    U . O AFTER . K , AFTER . U

    .T . U , :

  • 7/22/2019 Baze Podataka 2 Skripta

    16/53

    16

    2.3.1. SUBP, . U

    , . K , , SQL: 1999 , .

    N T S

    .

    N . Z, O JN. N

    JN AB IDO.

    :

    T T

    K P ?

    I NE

    UAB DA

    U JN OOPJN,

    AB

    JN

    D NE

    I DA U AB IDO

    U

    IDO DA

    U AB

    IDO

    AB DA S

    D NE

    U

    O SUBP.

  • 7/22/2019 Baze Podataka 2 Skripta

    17/53

    17

    U AB OOPJN,

    JN. O AFTER UPDATE

    , FOR EACH ROW (P 2). K

    , AFTER ,

    . D, AB

    OOPJN. T (AFTER),

    AB, JN (FOR EACH

    ROW), IDO

    OOPJN. K OOPJN , SUBP

    . D

    AB , , ,

    BEFORE ,

    (P 1).

    P O :

    CREATE OR REPLACE PACKAGE "PAKET" AS

    ODLUKA NUMBER:=0;SIFRA NUMBER:=0;IMEPREZIME VARCHAR2(20);IDZAP NUMBER:=0;END;

    K O SUBP.

    CREATE OR REPLACE TRIGGER "ODLUKAJNPRE"BEFORE INSERT OR UPDATE OR DELETE ON ODLUKAJNFOR EACH ROWBEGIN

    IF (INSERTING OR UPDATING)

    THENBEGIN

    PAKET.SIFRA:=:NEW.ARHIVSKIBROJ;PAKET.ODLUKA:=:NEW.IDODLUKEOPOKRETANJU;PAKET.STARASIFRA:=:OLD.ARHIVSKIBROJ;PAKET.STARAODLUKA:=:OLD.IDODLUKEOPOKRETANJU;END;

    ELSEBEGIN

    PAKET.SIFRA:=:OLD.ARHIVSKIBROJ;PAKET.ODLUKA:=:OLD.IDODLUKEOPOKRETANJU;END;

    END IF;END;

    1 BEFE IE, DAE DEEE

    CREATE OR REPLACE TRIGGER "ODLUKAJN"AFTER UPDATE OF ARHIVSKIBROJON ODLUKAOPOKRETANJUPOSTUPKAFOR EACH ROWDECLAREPRAGMA AUTONOMOUS_TRANSACTION;BEGINEXECUTE IMMEDIATE 'ALTER TRIGGER NEMENJAJARHIVSKIBROJ DISABLE';UPDATE JAVNANABAVKA

  • 7/22/2019 Baze Podataka 2 Skripta

    18/53

    18

    SET ARHIVSKIBROJ = PAKET.SIFRAWHERE IDODLUKEOPOKRETANJU = PAKET.ODLUKA;COMMIT;BEGINEXECUTE IMMEDIATE 'ALTER TRIGGER NEMENJAJARHIVSKIBROJ ENABLE';END;END;

    2 AFE DAE

    N D P

    .

    N . Z, Z K. N

    K IP IDZ.

    :

    T T

    K P ?

    I NE

    UIP DA

    P

    IP

    Z,

    K.

    D NE

    I DAU IP

    IDZ.

    U IP DA S .

    D NE

  • 7/22/2019 Baze Podataka 2 Skripta

    19/53

    19

    O

    . D AFTER INSERT FOR EACH ROW. P

    2. Z , ,

    , IDZ .

    P Z,

    IZ . D ,

    IP

    .

    CREATE OR REPLACE TRIGGER "CLANOVI"AFTER INSERT

    ON CLANKOMISIJEFOR EACH ROW

    DECLAREV_IMEPREZIME VARCHAR2(20);

    BEGINSELECT IMEPREZIME INTO V_IMEPREZIME

    FROM ZAPOSLENIWHERE IDZAPOSLENOG = PAKET.IDZAP;PAKET.IMEPREZIME := V_IMEPREZIME;

    END;

    3 AFE IE

    N AFTER DELETE

    (P 4). N . T

    ; P

    P.

    CREATE OR REPLACE TRIGGER NEBRISIAFTER DELETE ON PONUDJACBEGIN

    RAISE_APPLICATION_ERROR (NUM => -20000,MSG => 'NE SMETE DA BRISETE POSTOJECE PONUDJACE');

    END; 4 AFE DEEE

    U O SUBP FOR EACH STATEMENT , FOR EACH ROW. STATEMENT NE POSTOJI O.

    K , . K S_O_P. U

  • 7/22/2019 Baze Podataka 2 Skripta

    20/53

    20

    . U INSTEAD OF . M INSTEAD OF P PD.

    Ponudjac (IDPonudjaca, NazivPunudjaca)

    PonudjacDetalji (IDPonudjaca, Delatnost, KontaktTelefon)

    K P

    CREATE TABLE PONUDJAC (IDPONUDJJACA NUMBER(7) PRIMARY KEY,NAZIVPONJUDJACA VARCHAR(20));

    K PD

    CREATE TABLE PONUDJACDETALJI (IDPONUDJJACA NUMBER(7) PRIMARY KEY,DELATNOST VARCHAR(20),

    KONTAKTTELEFON VARCHAR(20));

    K S_O_P

    CREATE OR REPLACE VIEW SVE_O_PONUDJACUASSELECT P.IDPONUDJACA, P.NAZIVPONUDJACA, D.DELATNOST, D.KONTAKTTELEFONFROM PONUDJAC P, PONUDJACDETALJI DWHERE P.IDPONUDJACA = D.IDPONUDJACA;

    K POGLEDTRIGER 5.

    CREATE OR REPLACE TRIGGER POGLEDTRIGERINSTEAD OF INSERT ON SVE_O_PONUDJACUREFERENCING NEW AS NOVIFOR EACH ROWBEGININSERT INTO PONUDJAC (IDPONUDJACA, NAZIVPONUDJACA) VALUES(:NOVI.IDPONUDJACA, : NOVI.NAZIVPONUDJACA);INSERT INTO PONUDJACDETALJI (IDPONUDJACA, DELATNOST, KONTAKTTELEFON) VALUES(:NOVI.IDPONUDJACA, : NOVI.DELATNOST, : NOVI.KONTAKTTELEFON);END;

    5 IEAD F

    SVE_O_PONUDJACU

    INSERT INTO SVE_O_PONUDJACU VALUES (1,'NAZIV','DELATNOST','KONTAKT');

  • 7/22/2019 Baze Podataka 2 Skripta

    21/53

    21

    2.3.2.

    U . K ,

    O . M, SQL S

    . SQL S FOR EACH ROW , ( ). U ,

    , SUBP . A

    , , BEFORE

    FOR EACH ROW. O SQL

    S. P DML (. D ) :

    AFTER SQL S 2000. T FOR ,

    . R O , . O . O

    INSERT, UPDATE DELETE, .

    INSTEAD OF O, , .

    CLR SUBP, AFTER INSTEAD OF. T DDL (. D ) . U

    ,

    .NET .

    S O, SQL

    .

    O SUBP

    . U . O

    . O . D

    .

    I :

    P U P I

  • 7/22/2019 Baze Podataka 2 Skripta

    22/53

    22

    T DELETE UPDATE . P , . O .

    I INSERT UPDATE . P ,

    . R .

    O , . S , .

    P O, SQL S SUBP. N, .

    CREATE TRIGGER "CLANOVI"ON [DBO].[CLANKOMISIJE]AFTER INSERT AS

    BEGINUPDATE [DBO].[CLANKOMISIJE]

    SET IMEPREZIME =(SELECT [IMEPREZIME1] FROM [DBO].[ZAPOSLENI]WHERE [IDZAPOSLENOG] = (SELECT [IDZAPOSLENOG] FROM INSERTED))

    FROM [DBO].[CLANKOMISIJE] YJOIN INSERTED I ON Y.IDZAPOSLENOG = I.IDZAPOSLENOGWHERE I.IMEPREZIME IS NULLEND

    6 AFE IE

    CREATE TRIGGER NEBRISION [DBO].[PONUDJAC]

    AFTER DELETE ASBEGINRAISERROR('NE SME SE BRISATI!', 16, -1)ROLLBACK TRANRETURN

    END

    7 AFE DEEE

    CREATE TRIGGER [dbo].[ODLUKAJN] ON [dbo].[ODLUKAOPOKRETANJUPOSTUPKA]AFTER UPDATE ASIF UPDATE (ARHIVSKIBROJ)BEGINALTER TABLE [dbo].[JAVNANABAVKA] DISABLE TRIGGER [NEMENJAJARHIVSKIBROJ]UPDATE [DBO].[JAVNANABAVKA]SET [ARHIVSKIBROJ] = (SELECT [ARHIVSKIBROJ] FROM INSERTED)WHERE IDODLUKEOPOKRETANJU = (SELECT [IDODLUKE] FROM INSERTED)ALTER TABLE [dbo].[JAVNANABAVKA] ENABLE TRIGGER [NEMENJAJARHIVSKIBROJ]END;

    8 AFE DAE

  • 7/22/2019 Baze Podataka 2 Skripta

    23/53

    23

    K POGLEDTRIGER

    CREATE TRIGGER POGLEDTRIGER ON SVE_O_PONUDJACUINSTEAD OF INSERTASBEGINSET NOCOUNT ONIF (NOT EXISTS (SELECT P.IDPONUDJACA

    FROM PONUDJAC P, INSERTED IWHERE P.IDPONUDJACA = I.IDPONUDJACA))

    INSERT INTO PONUDJACSELECT IDPONUDJACA, NAZIVPONUDJACAFROM INSERTED

    IF (NOT EXISTS (SELECT E.IDPONUDJACAFROM PONUDJACDETALJI E, INSERTEDWHERE E.IDPONUDJACA = INSERTED.IDPONUDJACA))

    INSERT INTO PONUDJACDETALJISELECT IDPONUDJACA, DELATNOST, KONTAKTTELEFON

    FROM INSERTEDELSE

    UPDATE PONUDJACDETALJISET IDPONUDJACA = I.IDPONUDJACA,

    DELATNOST = I.DELATNOST,KONTAKTTELEFON = I.KONTAKTTELEFON

    FROM PONUDJACDETALJI E, INSERTED IWHERE E.IDPONUDJACA = I.IDPONUDJACA

    END

    9 IEAF F

    K SVE_O_PONUDJACU

    INSERT INTO [DBO].[SVE_O_PONUDJACU] VALUES (3,'PON3','DEL3','KON3');

    CREATE TRIGGER NEMENJAJARHIVSKIBROJON [DBO].[JAVNANABAVKA]

    AFTER UPDATE ASBEGIN

    IF UPDATE (ARHIVSKIBROJ)RAISERROR('NE SME SE MENJATI!', 16, -1)

    END

    10

  • 7/22/2019 Baze Podataka 2 Skripta

    24/53

    24

    2.3.3.

    PSQL SUBP

    . M, . Z O SUBP, INSTEAD OF

    , . I SQLS. J BEFORE AFTER ,

    . P ,

    TRUNCATE ,

    .

    U

    .

    BEFOREINSERT/UPDATE/DELETE

    TRUNCATE

    AFTERINSERT/UPDATE/DELETE T T

    TRUNCATE T

    INSTEAD OF

    INSERT/UPDATE/DELETE

    TRUNCATE

    2 I

  • 7/22/2019 Baze Podataka 2 Skripta

    25/53

    25

    1. L B., M Z., A N., B S., B , B, 2006.2. T DML T,

    ://..///178134%28=.105%29.

    3. P CLR T,://..///179562%28=.105%29.

    4. PSQL 9.1.9 D, ://..//9.1//.

  • 7/22/2019 Baze Podataka 2 Skripta

    26/53

    26

    3. D SUBP

    . R () ()

    ,

    . O

    . D ,

    . T

    .

    K

    , ,

    .

    B . N

    . N (

    , ). O ,

    . N

    SQL:1999 ,

    .

    3.1.

    K () . U

    , . K

    .

    3.1.1.

    S , ,

    . A , ,

    , . P

    , , ,

    . S ,

    . S

    :

  • 7/22/2019 Baze Podataka 2 Skripta

    27/53

    27

    CREATE TYPE [UNDER ]AS ( , ...)[[NOT] INSTANTIABLE]NOT FINAL

    [][, ...]

    S A, ,

    , O:

    CREATE OR REPLACETYPE obj_adresa_br AS OBJECT( ulica varchar2(50),broj number,dodatakbroju VARCHAR2(10),

    MEMBER FUNCTION get_ulica RETURN varchar2,

    MEMBER FUNCTION get_broj RETURN number,MEMBER FUNCTION get_dodatakbroju RETURN varchar2)INSTANTIABLE NOT FINAL;

    CREATE OR REPLACETYPE BODY obj_adresa_br AS

    MEMBER FUNCTION get_ulica RETURN varchar2 ISBEGINRETURN SELF.ulica;

    END;MEMBER FUNCTION get_broj RETURN number ISBEGINRETURN SELF.broj;

    END;MEMBER FUNCTION get_dodatakbroju RETURN varchar2 ISBEGINRETURN SELF.dodatakbroju;

    END;END;

    N , :

    CREATE TABLE adresa ( sifra_adr number NOT NULL,adresa obj_adresa_br,CONSTRAINT adresa_pk PRIMARY KEY (sifra_adr));

    N , :

    INSERT INTO adresaVALUES (1,obj_adresa_br('Jove Ilica',154,A));

    N , :

    SELECTa.sifra_adr "Sifra adrese",

  • 7/22/2019 Baze Podataka 2 Skripta

    28/53

    28

    a.adresa.get_ulica() "Ime ulice",a.adresa.get_broj() "Broj",a.adresa.dodatakbroju.get_dodatakbroju()"Dodatak broju"

    FROM adresa a;

    N M :

    using System;using System.Data;using System.Data.SqlClient;using System.Data.SqlTypes;using Microsoft.SqlServer.Server;using System.IO;

    [Serializable][Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined,MaxByteSize = 800)]

    public struct Adresa : INullable, IBinarySerialize{

    public bool IsNull{

    get{

    // Put your code herereturn m_Null;

    }}public static Adresa Null{

    get{

    Adresa h = new Adresa();h.m_Null = true;return h;

    }

    }private string nazivUlice;private int broj;private string dodatakBroju;private bool m_Null;

    public Adresa(string nazivUlice, int broj, string dodatakBroju){

    this.nazivUlice = nazivUlice;this.broj = broj;this.dodatakBroju = dodatakBroju;m_Null = false;

    }public override string ToString()

    { if (this.IsNull)return "null";

    else{

    string delim = new string((new char[] { ';' }));return(this.nazivUlice + delim + this.broj + delim +

    this.dodatakBroju);}

    }

  • 7/22/2019 Baze Podataka 2 Skripta

    29/53

    29

    public static Adresa Parse(SqlString s){

    if (s.IsNull)return Null;

    else{

    Adresa addr = new Adresa();string str = Convert.ToString(s);string[] a = null;a = str.Split(new char[] { ';' });addr.nazivUlice = a[0] == null ? string.Empty :

    a[0];int broj = Convert.ToInt32(a[1]);ValidateBroj(broj);addr.broj = broj;if (a.Length == 3){

    addr.dodatakBroju = a[2];}else{

    addr.dodatakBroju = string.Empty;}addr.m_Null = false;return (addr);

    }}

    private static void ValidateBroj(int broj){

    if (broj < 0){

    throw new ArgumentOutOfRangeException("Broj ne moebiti manji od 0");

    }

    }

    public string NazivUlice{

    get{

    return (this.nazivUlice);}set{

    this.nazivUlice = value;this.m_Null = false;

    }}

    public int Broj{

    get{

    return (this.broj);}set{

    this.broj = value;

  • 7/22/2019 Baze Podataka 2 Skripta

    30/53

    30

    this.m_Null = false;}

    }public string DodatakBroju{

    get{

    return (this.dodatakBroju);}set{

    if (!string.IsNullOrEmpty(value)){

    this.dodatakBroju = value;this.m_Null = false;

    }}

    }

    public override bool Equals(object other){

    return this.CompareTo(other) == 0;

    }

    public override int GetHashCode(){

    if (this.IsNull)return 0;

    return this.ToString().GetHashCode();}

    public int CompareTo(object other){

    if (other == null)return 1; //by definition

    Adresa addr = (Adresa)other;

    if (addr.Equals(null))throw new ArgumentException("the argument to compare

    is not a adresa");

    if (this.IsNull){

    if (addr.IsNull)return 0;

    return -1;}

    if (addr.IsNull)return 1;

    return this.ToString().CompareTo(addr.ToString());}

    public void Write(System.IO.BinaryWriter w){

  • 7/22/2019 Baze Podataka 2 Skripta

    31/53

    31

    byte header = (byte)(this.IsNull ? 1 : 0);

    w.Write(header);if (header == 1){

    return;}

    w.Write(this.NazivUlice);ValidateBroj(this.Broj);w.Write(this.Broj);w.Write(this.DodatakBroju);

    }

    public void Read(System.IO.BinaryReader r){

    byte header = r.ReadByte();

    if (header == 1){

    this.m_Null = true;return;

    }

    this.m_Null = false;this.nazivUlice = r.ReadString();int broj = r.ReadInt32();ValidateBroj(broj);this.broj = broj;this.dodatakBroju = r.ReadString();

    }}

    3.1.2.

    D , , ,

    . Z SQL

    . D :

    CREATE TYPE

    AS FINAL

    []

    D (FINAL), ,

    . D .O . M

    CAST . N

    ()

    . D , ,

    . I SQL:1999

    , PL/SQL, O, .

  • 7/22/2019 Baze Podataka 2 Skripta

    32/53

    32

    S SQL:1999 O O .

    N, O, O SQL:1999

    , O SQL:1999

    . D , (9,2).

    CREATE OR REPLACE TYPE "dinar" AS OBJECT (vrednost number(9,2),

    MEMBER FUNCTION get_vrednost RETURN number)INSTANTIABLE NOT FINAL;/CREATE OR REPLACE TYPE BODY "DINAR" AS

    MEMBER FUNCTION get_vrednost RETURN number ISBEGINRETURN SELF.vrednost;

    END;END;

    K S_C, . R

    S_C .

    STAVKA_CENOVNIKA(SifraCenovnika, RedniBroj, Cena, SifraProizvoda)

    N S_C :

    CREATE TABLE stavka_cenovnika(SifraCenovnika number,RedniBroj number,Cena dinar,SifraProizvoda number,CONSTRAINT scfk1 FOREIGN KEY (ifraCenovnika) REFERENCEScenovnik(ifraCenovnika),CONSTRAINT scfk2 FOREIGN KEY (ifraProizvoda) REFERENCESproizvod(ifraProizvoda),CONSTRAINT scpk PRIMARY KEY (ifraCenovnika, RedniBroj));

    N (_):

    INSERT INTO stavka_cenovnika VALUES(1,1,dinar(1000),1)

    N (_):

    SELECTsc.sifracenovnika,sc.rednibroj,sc.cena.get_vrednost(),sc.sifraproizvodaFROM stavka_cenovnika sc

    WHERE sifraproizvoda=1;

    N M :

    CREATE TYPE [dbo].[dinar] FROM [decimal](9, 2);

  • 7/22/2019 Baze Podataka 2 Skripta

    33/53

    33

    3.2. P SQL:1999 , (),

    . P . I

    ( O), .

    3.2.1.

    T ,

    . T

    . S REF

    :

    ATRIBUT REF(TIP) SCOPE RELACIJA

    U TIP , REF(TIP) ,

    TIP. R (SCOPE),

    ( RELACIJA).

    3.2.2.

    O (, ). O SQL:1999

    ,

    . P .

    create table kolekcija_boja (boja raw(16));

    P :

    insert into kolekcija_boja values ('FF0000');

    P :

    select * from kolekcija_boja where utl_raw.substr(boja, 1, 2) = 'FF';

  • 7/22/2019 Baze Podataka 2 Skripta

    34/53

    34

    3.2.3.

    A . S

    . S , . B

    .O , .

    V . S :

    CREATE OR REPLACE TYPE name-of-type IS VARRAY(nn)of type

    K :

    CREATE TYPE phones AS VARRAY(10) OF varchar2(10);

    S :

    reate table suppliers (supcode number(5),Company varchar2(20),ph phones);

    N :

    insert into suppliers values (101,Interface Computers,Phones(64199705,55136663));

    insert into suppliers values (102,Western Engg. Corp,Phones(23203945,23203749,9396577727));

    N :

    Select * from suppliers;

    3.2.4.

    N , .

    . O

    . P ( D CL):

    CREATE OR REPLACE TYPE CourseList AS TABLE OF VARCHAR2(64);SELECT type, textFROM user_sourceWHERE name = 'COURSELIST';CREATE TABLE department (name VARCHAR2(20),

  • 7/22/2019 Baze Podataka 2 Skripta

    35/53

    35

    director VARCHAR2(20),office VARCHAR2(20),courses CourseList)NESTED TABLE courses STORE AS courses_tab;

    N :

    SELECT column_name, data_type, data_lengthFROM user_tab_colsWHERE table_name = 'DEPARTMENT';

    SELECT table_name, table_type_owner, table_type_name,parent_table_columnFROM user_nested_tables;

    N :

    SELECT cardinality(courses)FROM department;

    INSERT INTO department(name, director, office, courses)VALUES('English', 'Lynn Saunders', 'Breakstone Hall 205', CourseList('Expository Writing','Film and Literature','Modern Science Fiction','Discursive Writing','Modern English Grammar','Introduction to Shakespeare',

    'Modern Drama','The Short Story','The American Novel'));

    SELECT * FROM department;

    SELECT cardinality(courses)FROM department;

  • 7/22/2019 Baze Podataka 2 Skripta

    36/53

    36

    U . N

    [1], ( , ). O

    [7 9]

    [2 6].

    1.L B, M Z, A N, B SB FON, 2006.2.C T., B C.,D : A ,

    P E L, 2004.

    3.B S., .,D D: K , M K, 2009.4.P G.,B D D, W P, 2006.5.H J., P M., MF F., D , P E,

    2007.

    6.H S.,D , J W & S, 2002.7.F S, P B / OR, 2009.8.R B, R E / EP H, 2009.9.W M, M B,I D E A, S,

    2007.

  • 7/22/2019 Baze Podataka 2 Skripta

    37/53

    37

    4. O

    . U :

    , .

    4.1. O

    . O . I

    , . I,

    ,

    . P

    (. , ). U

    .

    4.1.1. U

    , , . K

    ,

    . P 2:

    2Zbog preglednosti, na PMOV u nee biti prikazivani svi atributi entiteta niti sve njihove veze.

    Profaktura(BrDok, DatumIzdavanja, Napomena, DatumIsporuke,RokVazenja, Avans, PIB, BrNar)

    StavkaProfakture(BrDok, RedBr, Kolicina, Napomena, SifraArt)

    Artikal(SifraArt, Dimenzija, OznakaKvl, AktuelnaCena,SifraStd,SifraKvl)

  • 7/22/2019 Baze Podataka 2 Skripta

    38/53

    38

    M

    , (

    ; Kolicina StavkaProfakture AktuelnaCena

    Artikal). K ,

    Profaktura Ukupno, .P :

    O

    , . N,

    ,

    DML

    . T , ,

    . N ,

    DML

    3.

    E D C D

    . O

    . P :

    3U okviru projektnog rada, zahteva sa da se aplikacioni kd koji vri izraunavanje izvedene vrednosti izdvoji u

    uskladitenu proceduru, kao i da se specificira tabela trigera koji e pozivati posmatranu uskladitenu proceduru

    kada je to potrebno. Detaljnije o ovome u delu o uskladitenim procedurama.

    Profaktura(BrDok, DatumIzdavanja, Napomena, DatumIsporuke,RokVazenja, Ukupno, Avans, PIB, BrNar)

    StavkaProfakture(BrDok, RedBr, Kolicina, Napomena, SifraArt)

    Artikal(SifraArt, Dimenzija, OznakaKvl, AktuelnaCena,SifraStd,SifraKvl)

  • 7/22/2019 Baze Podataka 2 Skripta

    39/53

    39

    U ,

    DO

    , .

    ...WHERE proizvodid = ...

    AND datumod = (SELECT max(datumod)

    FROM cenaproizvoda

    WHERE datumod

  • 7/22/2019 Baze Podataka 2 Skripta

    40/53

    40

    C I C D

    . S

    E D C . R , C I C

    . U

    E D C , C I

    C

    :

    K , CenaProizvoda TrenutnaCena

    . U , ,

    , .

    ...WHERE proizvodid = ...

    AND trenutnacena = da

    N,

    DML (.

    TrenutnaCena ).

    4.1.2.

    P , . P

    :

    Proizvod(ProizvodID, Naziv, SkraceniNaziv, JedMereID, KategorijaID)

    CenaProizvoda(ProizvodID,DatumOd,Cena, TrenutnaCena)

  • 7/22/2019 Baze Podataka 2 Skripta

    41/53

    41

    M . U

    ,

    (E D C )

    (C I C ). U D

    , . D , , Artikal, .

    R Artikal AktuelnaCena

    . K ,

    ( , ,

    ).

    Artikal(SifraArt, Dimenzija, OznakaKvl,SifraStd, SifraKvl)

    Cena(SifraArt,DatumOd,Iznos)

    Artikal(SifraArt, Dimenzija, OznakaKvl,AktuelnaCena,SifraStd,SifraKvl)

    Cena(SifraArt,DatumOd,Iznos)

  • 7/22/2019 Baze Podataka 2 Skripta

    42/53

    42

    4.1.3. U ,

    K D

    . P :

    K ,

    . O . U

    , , ,

    .

    D, ( S)

    ( PO), ,

    .

    4.1.4. U , ,

    , H

    C . O

    , ,

    Student(StudentID, BrIndeksa, Ime, Prezime, DatumRoenja,SifraSmera)

    ProsecnaOcena(StudentID,GodinaStudija,Vrednost)

    Student(StudentID, BrIndeksa, Ime, Prezime, DatumRoenja,ProsekPrva, ProsekDruga, ProsekTreca, ProsekCetvrta, SifraSmera)

  • 7/22/2019 Baze Podataka 2 Skripta

    43/53

    43

    . P

    :

    Ako se uzme u obzir da relacija Statusima samo dve n torke, obzirom da student

    moe biti u statusu samofinansirajueg ili budetskog studenta, moe se izvriti Hard Coded Valuesoptimizacija, pri emu se dobija sledei konceptualni model:

    K Status , Student

    Status . S

    Status( ), . N

    , CHECK Status Student.

    4.2. I

    . D :

    P . O

    . U , SUBP

    .

    Student(StudentID, BrIndeksa, Ime, Prezime, DatumRoenja, SmerID,StatusID)

    Status(StatusID, Naziv)

    Student(StudentID, BrIndeksa, Ime, Prezime, DatumRoenja, Status,SmerID)

  • 7/22/2019 Baze Podataka 2 Skripta

    44/53

    44

    P ,

    :

    K JOIN K K WHERE K ORDER BY

    K :

    K WHERE ORDER BY K K ,

    P :

    Racun (SifraRacuna, Datum_izdavanja_racuna, Mesto_izdavanja,

    Sifra_radnika, Sifra_valute, Sifra_metoda_isporuke)

    M

    Datum_izdavanja_racuna. Z Datum_izdavanja_racuna Racun

    .

    Opta sintaksa za kreranje indeksa je:

    create [unique] indexon ( [,, ])

    N SUBP, SUBP

    , .

    U ,

    Datum_izdavanja_racuna :

    create index racun_ind on racun (datum_izdavanja_racuna);

  • 7/22/2019 Baze Podataka 2 Skripta

    45/53

    45

    4.3. P

    SUBP . V

    ,

    , ,

    , . P ,

    . U

    ,

    .

    P :

    Kupac(ifraKupca, NazivKupca, RaunKupca, TelefonKupca,

    FaksKupca, MatiniBroj, PIB, Adresa, IDMesta)

    M , ifraKupca,

    NazivKupca Adresa, , . T :

    Kupac(ifraKupca, NazivKupca, Adresa)

    Kupac_Detalji(ifraKupca, RaunKupca, TelefonKupca, FaksKupca,

    MatiniBroj, PIB, IDMesta)

    Z

    , . T,

    . P Kupac

    Kupac_Detalji Kupac :

    CREATE OR REPLACE VIEW KUPAC_VIEWASSELECT K.SifraKupca, K.NazivKupca, K.Adresa, KD.RacunKupca,KD.TelefonKupca, KD.FaksKupca, KD.MaticniBroj, KD.PIB, KD.IDMestaFROM KUPAC K, KUPAC_DETALJI KDWHERE K.SifraKupca = KD.SifraKupca;

    N INSTEAD OF

    ,

    ( , Kupac_view Kupac Kupac_Detalji, Kupac

    ifraKupca, Nazivkupca Adresa, Kupac_Detalji).

  • 7/22/2019 Baze Podataka 2 Skripta

    46/53

    46

    4.4. M ().

    . P

    . P SQL SQL . P ,

    . P

    () . P :

    CREATE [OR REPLACE] PROCEDURE [schema.] naziv_procedure [(parametar [,parametar ...])]AS[deklaracija_lokalnih_promenljivih]BEGINizvrne_naredbe[EXCEPTION excption_handlers]END [naziv_procedure];

    P , ( IN,

    OUT / IN/OUT). S : ,

    AS ( AS IS );

    PROCEDURE () ,

    AS. R REPLACE

    , . . P

    . U ,

    . D ,

    . N AS

    . U , AS BEGIN.N BEGIN : ,

    . M . I

    EXCEPTION . N

    END , , .

    4.4.1. : U , .

    P, , R S D M . U D ,

    . U , Artikal,

    .

  • 7/22/2019 Baze Podataka 2 Skripta

    47/53

    47

    R Artikal AktuelnaCena

    . N ( ,

    ,

    ). T

    :

    T T K P ?

    I NE

    U AC DAZ

    AC P

    D NE

    C

    I DA

    P CP,

    AC

    P

    U C DA

    P CP,

    AC

    P

    D DA

    P CP,

    AC

    P

    Artikal(SifraArt, Dimenzija, OznakaKvl,AktuelnaCena,SifraStd,SifraKvl)

    Cena(SifraArt,DatumOd,Iznos)

  • 7/22/2019 Baze Podataka 2 Skripta

    48/53

    48

    P

    . B

    P. I

    AC . V , ,

    AC. P , CP,

    CP, . U ,

    ,

    . U

    . P :

    CREATE OR REPLACE TRIGGER "AKTUELNAC"BEFORE INSERT OR UPDATE OR DELETE ON cenaProizvodaFOR EACH ROWBEGINIF (INSERTING OR UPDATING) THEN

    BEGINcenap.sifra := :NEW.sifraproizvoda;

    END;ELSE

    BEGINcenap.sifra := :OLD.sifraproizvoda;

    END;END IF;

    END;

    T :

    CREATE OR REPLACE TRIGGER "AKTUELNAC2"

    AFTER INSERT OR UPDATE OR DELETE ON cenaProizvodaDECLARE

    s NUMBER:=cenaP.sifra;BEGIN

    aktuelnacena(s);END;

    U

    P. U , , ,

    , , . N

    , ()

    . U :

    CREATE OR REPLACE PROCEDURE "AKTUELNACENA" (SifraPro IN NUMBER) ASaktCena PROIZVOD.AKTUELNACENA%type;

    BEGINaktCena:=0;

    SELECT cena INTO aktCena FROM CenaProizvoda

  • 7/22/2019 Baze Podataka 2 Skripta

    49/53

    49

    WHERE sifraProizvoda=SifraPro and datumOd=(select max(DATUMOD) fromcenaProizvoda where sifraProizvoda=SifraPro and datumOd

  • 7/22/2019 Baze Podataka 2 Skripta

    50/53

    50

    O

    , . N,

    ,

    DML . T , ,

    . N ,

    DML

    . T

    :

    T T K P ?

    I NE

    U U DA Z U

    D NE

    I DA

    P

    SP,

    U

    P

    U K DA

    P

    SP,

    U

    P

    D DA P

    Profaktura(BrDok, DatumIzdavanja, Napomena, DatumIsporuke,RokVazenja, Ukupno, Avans, PIB, BrNar)

    StavkaProfakture(BrDok, RedBr, Kolicina, Napomena, SifraArt)

    Artikal(SifraArt, Dimenzija, OznakaKvl, AktuelnaCena,SifraStd,SifraKvl)

  • 7/22/2019 Baze Podataka 2 Skripta

    51/53

    51

    SP,

    U

    P

    P

    . B

    P. I

    U P. V , ,

    U P. P ,

    SP,

    SP, . U

    , ,

    . U

    . P

    :

    CREATE OR REPLACE TRIGGER "SUMASP"BEFORE INSERT OR UPDATE OR DELETE ON stavkaProfaktureFOR EACH ROWBEGIN

    IF (INSERTING OR UPDATING) thenBEGIN

    stavkap.brdok := :NEW. brdok;END;

    ELSEBEGIN

    stavkap.brdok:= :OLD. brdok;END;

    END IF;END;

    T :

    CREATE OR REPLACE TRIGGER "SUMASP2"AFTER INSERT OR UPDATE OR DELETE ON stavkaProfaktureDECLARE

    dok NUMBER:=stavkap.brdok;BEGIN

    sumaStavkiProfakture(dok);END;

    U ,

    P. U BD ( ), ,

    , , ,

    . N ,

  • 7/22/2019 Baze Podataka 2 Skripta

    52/53

    52

    SP() . U

    :

    CREATE OR REPLACE PROCEDURE "SUMASTAVKIPROFAKTURE" (sifDok IN NUMBER) ASsuma NUMBER:=0;

    BEGINSELECT SUM(p.aktuelnacena*sp.kolicina) INTO suma

    FROM proizvod p join stavkaprofakture sp on(p.sifraproizvoda=sp.sifraproizvoda)WHERE brdok=SifDok;

    UPDATE ProfakturaSET Ukupno=sumaWHERE brdok=SifDok;END;

    P (IN) ( NUMBER)

    . S

    P C P . Z,

    P, . U . U

    . U

    , M SQL S (T/SQL):

    CREATE PROCEDURE [dbo].[sp_SumaStavkiProfakture]

    @BrDok int = 0

    ASBEGIN

    SET NOCOUNT ON;

    declare @ukupno numeric(18,0);SELECT @ukupno =

    SUM(p.aktuelnacena*sp.kolicina)FROM Arikal p inner join stavkaprofakture sp on p.sifrapro=sp.sifraproWHERE brdok=@BrDok;

    UPDATE ProfakturaSET Ukupno = @ukupnoWHERE Profaktura.BrDok = @BrDokEND

  • 7/22/2019 Baze Podataka 2 Skripta

    53/53

    T [1], [2] [3].

    V [2], [4], [5] [6],

    . P [9 14].

    1. W M., M B.,I D E A, S,2007.

    2. M C., D A: C G ,A W, 2002.

    3. C T., B C., D : A ,P E L, 2004.

    4. H J., D D I, M K, 2009.5. L S., T T., N T., D D, M K, 2007.6. B S., .,D D: K , M K, 2009.7. P G.,B D D, W P, 2006.8. H J., P M., MF F., D , P E,

    2007.

    9. F S, P B / OR, 2009.10.

    R B, R E / EP H, 2009.

    11. W M, M B,I D E A, S,2007.

    12. M C.,D A: C G ,A W, 2002.

    13. L S., T T., N T., D D, M K, 2007.14. B S., .,D D: K , M K, 2009.