Changes between Version 2 and Version 3 of DatabaseProgramming


Ignore:
Timestamp:
06/10/26 23:17:11 (8 hours ago)
Author:
231018
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v2 v3  
    1717AS $$
    1818DECLARE
    19     v_status INTEGER;
    20 BEGIN
    21     SELECT status
     19    v_status VARCHAR;
     20BEGIN
     21    SELECT sk.ime
    2222    INTO v_status
    23     FROM Kazna
    24     WHERE kazna_id = p_kazna_id;
    25 
    26     IF v_status = 1 THEN
    27         RETURN 'platena';
    28     ELSIF v_status = 0 THEN
    29         RETURN 'neplatena';
    30     ELSE
    31         RETURN 'ponishtena';
    32     END IF;
    33 END;
    34 $$
    35 LANGUAGE plpgsql;
     23    FROM Kazna k
     24    JOIN StatusKazna sk ON sk.status_kazna_id = k.status_kazna_id
     25    WHERE k.kazna_id = p_kazna_id;
     26
     27    IF v_status IS NULL THEN
     28        RETURN 'Kaznata ne postoi';
     29    ELSIF LOWER(v_status) = 'platena' THEN
     30        RETURN 'Kaznata e platena';
     31    ELSIF LOWER(v_status) = 'neplatena' THEN
     32        RETURN 'Kaznata ne e platena';
     33    ELSIF LOWER(v_status) = 'ponishtena' THEN
     34        RETURN 'Kaznata e ponishtena';
     35    ELSE
     36        RETURN 'Nepoznat status na kazna';
     37    END IF;
     38END;
     39$$
     40LANGUAGE plpgsql;
     41
    3642}}}
    3743
     
    5460    WHERE tip_prekrsok_id = p_tip_prekrsok_id;
    5561
    56     RETURN v_iznos;
     62    IF v_iznos IS NULL THEN
     63        RAISE EXCEPTION 'Ne postoi tip na prekrsok so id %', p_tip_prekrsok_id;
     64    ELSIF v_iznos <= 0 THEN
     65        RAISE EXCEPTION 'Iznosot na kaznata mora da bide pogolem od 0';
     66    ELSE
     67        RETURN v_iznos;
     68    END IF;
    5769END;
    5870$$
     
    7385CREATE OR REPLACE PROCEDURE sp_evidentiraj_plakanje(
    7486    p_kazna_id INTEGER,
    75     p_metod INTEGER
     87    p_metod_plakanje_id INTEGER
    7688)
    7789AS $$
    78 BEGIN
    79     INSERT INTO Plakanje(metod, datum, kazna_id)
    80     VALUES(p_metod, CURRENT_DATE, p_kazna_id);
     90DECLARE
     91    v_postoi_kazna INTEGER;
     92    v_postoi_metod INTEGER;
     93    v_status VARCHAR;
     94BEGIN
     95    SELECT COUNT(*)
     96    INTO v_postoi_kazna
     97    FROM Kazna
     98    WHERE kazna_id = p_kazna_id;
     99
     100    IF v_postoi_kazna = 0 THEN
     101        RAISE EXCEPTION 'Ne postoi kazna so id %', p_kazna_id;
     102    END IF;
     103
     104
     105    SELECT COUNT(*)
     106    INTO v_postoi_metod
     107    FROM MetodPlakanje
     108    WHERE metod_plakanje_id = p_metod_plakanje_id;
     109
     110    IF v_postoi_metod = 0 THEN
     111        RAISE EXCEPTION 'Ne postoi metod na plakanje so id %', p_metod_plakanje_id;
     112    END IF;
     113
     114
     115    SELECT sk.ime
     116    INTO v_status
     117    FROM Kazna k
     118    JOIN StatusKazna sk ON sk.status_kazna_id = k.status_kazna_id
     119    WHERE k.kazna_id = p_kazna_id;
     120
     121
     122    IF LOWER(v_status) = 'platena' THEN
     123        RAISE EXCEPTION 'Kaznata e vekje platena';
     124    ELSIF LOWER(v_status) = 'ponishtena' THEN
     125        RAISE EXCEPTION 'Ponisthena kazna ne moze da se plati';
     126    ELSE
     127        INSERT INTO Plakanje(
     128            metod_plakanje_id,
     129            datum,
     130            kazna_id
     131        )
     132        VALUES(
     133            p_metod_plakanje_id,
     134            CURRENT_DATE,
     135            p_kazna_id
     136        );
     137    END IF;
    81138END;
    82139$$
     
    96153    p_prekrsok_id INTEGER
    97154)
    98 AS
    99 $$
    100 BEGIN
    101     INSERT INTO Zalba(
    102         sodrzina,
    103         datum_na_podnesuvanje,
    104         status,
    105         korisnik_id,
    106         prekrsok_id
    107     )
    108     VALUES(
    109         p_sodrzina,
    110         CURRENT_DATE,
    111         'podnesena',
    112         p_korisnik_id,
    113         p_prekrsok_id
    114     );
     155AS $$
     156DECLARE
     157    v_status_podnesena INTEGER;
     158    v_postoi_korisnik INTEGER;
     159    v_postoi_prekrsok INTEGER;
     160BEGIN
     161    IF p_sodrzina IS NULL OR LENGTH(TRIM(p_sodrzina)) = 0 THEN
     162        RAISE EXCEPTION 'Zalbata mora da ima sodrzina';
     163    END IF;
     164
     165
     166    SELECT COUNT(*)
     167    INTO v_postoi_korisnik
     168    FROM Korisnik
     169    WHERE korisnik_id = p_korisnik_id;
     170
     171    IF v_postoi_korisnik = 0 THEN
     172        RAISE EXCEPTION 'Ne postoi korisnik so id %', p_korisnik_id;
     173    END IF;
     174
     175
     176    SELECT COUNT(*)
     177    INTO v_postoi_prekrsok
     178    FROM Prekrsok
     179    WHERE prekrsok_id = p_prekrsok_id;
     180
     181    IF v_postoi_prekrsok = 0 THEN
     182        RAISE EXCEPTION 'Ne postoi prekrsok so id %', p_prekrsok_id;
     183    END IF;
     184
     185
     186    SELECT status_zalba_id
     187    INTO v_status_podnesena
     188    FROM StatusZalba
     189    WHERE LOWER(ime) = 'podnesena';
     190
     191    IF v_status_podnesena IS NULL THEN
     192        RAISE EXCEPTION 'Vo StatusZalba ne postoi status podnesena';
     193    ELSE
     194        INSERT INTO Zalba(
     195            sodrzina,
     196            datum_na_podnesuvanje,
     197            status_zalba_id,
     198            korisnik_id,
     199            prekrsok_id
     200        )
     201        VALUES(
     202            p_sodrzina,
     203            CURRENT_DATE,
     204            v_status_podnesena,
     205            p_korisnik_id,
     206            p_prekrsok_id
     207        );
     208    END IF;
    115209END;
    116210$$
     
    128222    p_zalba_id INTEGER,
    129223    p_administrator_id INTEGER,
    130     p_status VARCHAR
     224    p_nov_status VARCHAR
    131225)
    132226AS $$
    133 BEGIN
    134     UPDATE Zalba
    135     SET administrator_id = p_administrator_id,
    136         status = p_status
     227DECLARE
     228    v_status_id INTEGER;
     229    v_postoi_zalba INTEGER;
     230    v_postoi_admin INTEGER;
     231BEGIN
     232    SELECT COUNT(*)
     233    INTO v_postoi_zalba
     234    FROM Zalba
    137235    WHERE zalba_id = p_zalba_id;
     236
     237    IF v_postoi_zalba = 0 THEN
     238        RAISE EXCEPTION 'Ne postoi zalba so id %', p_zalba_id;
     239    END IF;
     240
     241
     242    SELECT COUNT(*)
     243    INTO v_postoi_admin
     244    FROM Administrator
     245    WHERE administrator_id = p_administrator_id;
     246
     247    IF v_postoi_admin = 0 THEN
     248        RAISE EXCEPTION 'Ne postoi administrator so id %', p_administrator_id;
     249    END IF;
     250
     251
     252    SELECT status_zalba_id
     253    INTO v_status_id
     254    FROM StatusZalba
     255    WHERE LOWER(ime) = LOWER(p_nov_status);
     256
     257    IF v_status_id IS NULL THEN
     258        RAISE EXCEPTION 'Ne postoi status na zalba so ime %', p_nov_status;
     259    ELSE
     260        UPDATE Zalba
     261        SET administrator_id = p_administrator_id,
     262            status_zalba_id = v_status_id
     263        WHERE zalba_id = p_zalba_id;
     264    END IF;
    138265END;
    139266$$
     
    150277CREATE OR REPLACE PROCEDURE sp_arhiviraj_stari_snimki()
    151278AS $$
    152 BEGIN
    153     UPDATE Snimka
    154     SET arhivirana = TRUE,
    155         datum_arhiviranje = CURRENT_DATE
     279DECLARE
     280    v_broj_snimki INTEGER;
     281BEGIN
     282    SELECT COUNT(*)
     283    INTO v_broj_snimki
     284    FROM Snimka
    156285    WHERE datum < CURRENT_DATE - INTERVAL '365 days'
    157286      AND arhivirana = FALSE;
     287
     288    IF v_broj_snimki = 0 THEN
     289        RAISE NOTICE 'Nema snimki za arhiviranje';
     290    ELSE
     291        UPDATE Snimka
     292        SET arhivirana = TRUE,
     293            datum_arhiviranje = CURRENT_DATE
     294        WHERE datum < CURRENT_DATE - INTERVAL '365 days'
     295          AND arhivirana = FALSE;
     296
     297        RAISE NOTICE 'Arhivirani se % snimki', v_broj_snimki;
     298    END IF;
    158299END;
    159300$$
     
    180321    v_kazna_id INTEGER;
    181322    v_iznos INTEGER;
    182 BEGIN
     323    v_status_kazna_id INTEGER;
     324    v_status_prekrsok_id INTEGER;
     325    v_postoi_tip INTEGER;
     326    v_postoi_kamera INTEGER;
     327BEGIN
     328    IF p_opis IS NULL OR LENGTH(TRIM(p_opis)) = 0 THEN
     329        RAISE EXCEPTION 'Opisot na prekrsokot ne smee da bide prazen';
     330    END IF;
     331
     332
     333    IF p_datum IS NULL THEN
     334        p_datum := CURRENT_DATE;
     335    END IF;
     336
     337
     338    IF p_detektirana_brzina IS NULL OR p_detektirana_brzina <= 0 THEN
     339        RAISE EXCEPTION 'Detektiranata brzina mora da bide pogolema od 0';
     340    END IF;
     341
     342
     343    SELECT COUNT(*)
     344    INTO v_postoi_tip
     345    FROM TipPrekrsok
     346    WHERE tip_prekrsok_id = p_tip_prekrsok_id;
     347
     348    IF v_postoi_tip = 0 THEN
     349        RAISE EXCEPTION 'Ne postoi tip prekrsok so id %', p_tip_prekrsok_id;
     350    END IF;
     351
     352
     353    SELECT COUNT(*)
     354    INTO v_postoi_kamera
     355    FROM Kamera
     356    WHERE kamera_id = p_kamera_id;
     357
     358    IF v_postoi_kamera = 0 THEN
     359        RAISE EXCEPTION 'Ne postoi kamera so id %', p_kamera_id;
     360    END IF;
     361
     362
     363    SELECT status_kazna_id
     364    INTO v_status_kazna_id
     365    FROM StatusKazna
     366    WHERE LOWER(ime) = 'neplatena';
     367
     368    IF v_status_kazna_id IS NULL THEN
     369        RAISE EXCEPTION 'Vo StatusKazna ne postoi status neplatena';
     370    END IF;
     371
     372
     373    SELECT status_prekrsok_id
     374    INTO v_status_prekrsok_id
     375    FROM StatusPrekrsok
     376    WHERE LOWER(ime) = 'aktiven';
     377
     378    IF v_status_prekrsok_id IS NULL THEN
     379        RAISE EXCEPTION 'Vo StatusPrekrsok ne postoi status aktiven';
     380    END IF;
     381
     382
    183383    v_iznos := fn_presmetaj_iznos_kazna(p_tip_prekrsok_id);
    184384
    185     INSERT INTO Kazna(datum, status, iznos_za_plakanje)
    186     VALUES(CURRENT_DATE, 0, v_iznos)
     385
     386    INSERT INTO Kazna(
     387        datum,
     388        status_kazna_id,
     389        iznos_za_plakanje
     390    )
     391    VALUES(
     392        CURRENT_DATE,
     393        v_status_kazna_id,
     394        v_iznos
     395    )
    187396    RETURNING kazna_id INTO v_kazna_id;
     397
    188398
    189399    INSERT INTO Prekrsok(
    190400        opis,
    191401        vreme,
    192         status,
     402        status_prekrsok_id,
    193403        datum,
    194404        detektirana_brzina,
     
    200410        p_opis,
    201411        p_vreme,
    202         0,
     412        v_status_prekrsok_id,
    203413        p_datum,
    204414        p_detektirana_brzina,
     
    231441    END IF;
    232442
     443
    233444    IF NEW.rok_na_plakanje IS NULL THEN
    234445        NEW.rok_na_plakanje := NEW.datum + INTERVAL '30 days';
     446    ELSIF NEW.rok_na_plakanje < NEW.datum THEN
     447        RAISE EXCEPTION 'Rokot za plakanje ne moze da bide pred datumot na kaznata';
     448    ELSE
     449        RETURN NEW;
    235450    END IF;
    236451
     
    251466RETURNS TRIGGER
    252467AS $$
    253 BEGIN
    254     UPDATE Kazna
    255     SET status = 1
    256     WHERE kazna_id = NEW.kazna_id;
     468DECLARE
     469    v_status_platena_id INTEGER;
     470    v_status_momentalen VARCHAR;
     471BEGIN
     472    SELECT sk.ime
     473    INTO v_status_momentalen
     474    FROM Kazna k
     475    JOIN StatusKazna sk ON sk.status_kazna_id = k.status_kazna_id
     476    WHERE k.kazna_id = NEW.kazna_id;
     477
     478
     479    IF v_status_momentalen IS NULL THEN
     480        RAISE EXCEPTION 'Kaznata ne postoi';
     481    ELSIF LOWER(v_status_momentalen) = 'ponishtena' THEN
     482        RAISE EXCEPTION 'Ponisthena kazna ne moze da se oznaci kako platena';
     483    ELSE
     484        SELECT status_kazna_id
     485        INTO v_status_platena_id
     486        FROM StatusKazna
     487        WHERE LOWER(ime) = 'platena';
     488
     489        IF v_status_platena_id IS NULL THEN
     490            RAISE EXCEPTION 'Vo StatusKazna ne postoi status platena';
     491        ELSE
     492            UPDATE Kazna
     493            SET status_kazna_id = v_status_platena_id
     494            WHERE kazna_id = NEW.kazna_id;
     495        END IF;
     496    END IF;
    257497
    258498    RETURN NEW;
     
    272512RETURNS TRIGGER
    273513AS $$
     514DECLARE
     515    v_status_prekrsok VARCHAR;
    274516BEGIN
    275517    IF NEW.sodrzina IS NULL OR LENGTH(TRIM(NEW.sodrzina)) = 0 THEN
     
    277519    END IF;
    278520
    279     RETURN NEW;
     521
     522    IF NEW.datum_na_podnesuvanje IS NULL THEN
     523        NEW.datum_na_podnesuvanje := CURRENT_DATE;
     524    END IF;
     525
     526
     527    SELECT sp.ime
     528    INTO v_status_prekrsok
     529    FROM Prekrsok p
     530    JOIN StatusPrekrsok sp ON sp.status_prekrsok_id = p.status_prekrsok_id
     531    WHERE p.prekrsok_id = NEW.prekrsok_id;
     532
     533
     534    IF v_status_prekrsok IS NULL THEN
     535        RAISE EXCEPTION 'Ne postoi prekrsok za koj se podnesuva zalbata';
     536    ELSIF LOWER(v_status_prekrsok) = 'ponishten' THEN
     537        RAISE EXCEPTION 'Ne moze da se podnese zalba za ponishten prekrsok';
     538    ELSE
     539        RETURN NEW;
     540    END IF;
    280541END;
    281542$$