Changes between Initial Version and Version 1 of AdvancedSqlAndStoredProcedures


Ignore:
Timestamp:
08/24/25 16:27:14 (9 days ago)
Author:
221007
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedSqlAndStoredProcedures

    v1 v1  
     1== Напредни Процедури
     2=== 1. Складирана процедура за додавање на на нов MedicalReport објект за конкретен Person запис
     3{{{
     4CREATE OR REPLACE PROCEDURE insert_medical_report(
     5    IN param_person_id INT,
     6    IN param_summary TEXT,
     7    IN param_doctor_id INT,
     8    IN param_next_control_date DATE,
     9    IN param_diagnosis_ids INT[]
     10)
     11    LANGUAGE plpgsql
     12AS
     13$$
     14DECLARE
     15    new_report_id         INT;
     16    variable_diagnosis_id INT;
     17BEGIN
     18    IF NOT EXISTS (SELECT 1
     19                   FROM person
     20                   WHERE person_id = param_person_id) THEN
     21        RAISE EXCEPTION 'Person with ID % does not exist', param_person_id;
     22    END IF;
     23    IF NOT EXISTS (SELECT 1 FROM doctor WHERE doctor_id = param_doctor_id) THEN
     24        RAISE EXCEPTION 'Doctor with ID % does not exist', param_doctor_id;
     25    END IF;
     26
     27    INSERT INTO report (report_type, summary, created_at, person_id)
     28    VALUES ('Medical', param_summary, CURRENT_TIMESTAMP, param_person_id)
     29    RETURNING report_id INTO new_report_id;
     30
     31    INSERT INTO medicalreport (report_id, doctor_id, next_control_date)
     32    VALUES (new_report_id, param_doctor_id, param_next_control_date);
     33
     34    IF param_diagnosis_ids IS NOT NULL THEN
     35        FOREACH variable_diagnosis_id IN ARRAY param_diagnosis_ids
     36            LOOP
     37                IF NOT EXISTS (SELECT 1 FROM diagnosis WHERE variable_diagnosis_id = variable_diagnosis_id) THEN
     38                    RAISE EXCEPTION 'Diagnosis ID % does not exist', variable_diagnosis_id;
     39                END IF;
     40                INSERT INTO medicalreport_diagnosis (report_id, diagnosis_id, added_on)
     41                VALUES (new_report_id, variable_diagnosis_id, CURRENT_TIMESTAMP);
     42            END LOOP;
     43    END IF;
     44END;
     45$$;
     46}}}
     47
     48=== 2. Складирана процедура за додавање на на нов EmploymentReport објект за конкретен Person запис
     49{{{
     50CREATE OR REPLACE PROCEDURE insert_employment_report(
     51    IN param_person_id INT,
     52    IN param_start_date DATE,
     53    IN param_end_date DATE,
     54    IN param_job_role TEXT,
     55    IN param_income NUMERIC,
     56    IN param_summary TEXT
     57)
     58    LANGUAGE plpgsql
     59AS
     60$$
     61DECLARE
     62    new_report_id INT;
     63BEGIN
     64    IF NOT EXISTS (SELECT 1
     65                   FROM person
     66                   WHERE person_id = param_person_id) THEN
     67        RAISE EXCEPTION 'Person with ID % does not exist', param_person_id;
     68    END IF;
     69
     70    IF param_end_date is not null and param_end_date < param_start_date then
     71        raise exception 'End date can not be before starting date';
     72    end if;
     73
     74    IF param_income is not null and param_income <= 0 then
     75        raise exception 'Income must be greater than 0';
     76    end if;
     77
     78    INSERT INTO report (report_type, summary, created_at, person_id)
     79    VALUES ('Employment', param_summary, CURRENT_TIMESTAMP, param_person_id)
     80    RETURNING report_id INTO new_report_id;
     81
     82    INSERT INTO employmentreport (report_id, start_date, end_date, job_role, income_per_month)
     83    VALUES (new_report_id,
     84            param_start_date,
     85            param_end_date,
     86            param_job_role,
     87            param_income);
     88END;
     89$$;
     90}}}
     91
     92=== 3. Складирана процедура за додавање на на нов CriminalReport објект за конкретен Person запис
     93{{{
     94CREATE OR REPLACE PROCEDURE insert_criminal_report(
     95    IN param_person_id INT,
     96    IN param_case_summary TEXT,
     97    IN param_location TEXT,
     98    IN param_is_resolved BOOLEAN,
     99    IN param_crime_type_id INT,
     100    IN param_punishment_type TEXT,
     101    IN param_fine_to_pay NUMERIC,
     102    IN param_release_date DATE
     103)
     104    LANGUAGE plpgsql
     105AS
     106$$
     107DECLARE
     108    new_report_id     INT;
     109    new_punishment_id INT;
     110BEGIN
     111    IF NOT EXISTS (SELECT 1
     112                   FROM person
     113                   WHERE person_id = param_person_id) THEN
     114        RAISE EXCEPTION 'Person with ID % does not exist', param_person_id;
     115    END IF;
     116
     117    IF NOT EXISTS (SELECT 1
     118                   FROM crimetype
     119                   WHERE crime_type_id = param_crime_type_id) THEN
     120        RAISE EXCEPTION 'CrimeType with ID % does not exist', param_crime_type_id;
     121    END IF;
     122
     123    INSERT INTO report (report_type, summary, created_at, person_id)
     124    VALUES ('Criminal', param_case_summary, CURRENT_TIMESTAMP, param_person_id)
     125    RETURNING report_id INTO new_report_id;
     126
     127    INSERT INTO criminalreport (report_id, location, resolved, crime_type_id)
     128    VALUES (new_report_id, param_location, param_is_resolved, param_crime_type_id);
     129
     130    IF param_punishment_type = 'PRISON' AND param_release_date IS NOT NULL THEN
     131        INSERT INTO punishment (report_id, value_unit, punishment_type, fine_to_pay, release_date)
     132        VALUES (new_report_id, 'years', LOWER(param_punishment_type), NULL, param_release_date)
     133        RETURNING punishment_id INTO new_punishment_id;
     134    END IF;
     135
     136    IF param_punishment_type = 'FINE' AND param_fine_to_pay IS NOT NULL THEN
     137        INSERT INTO punishment (report_id, value_unit, punishment_type, fine_to_pay, release_date)
     138        VALUES (new_report_id, 'euros', LOWER(param_punishment_type), param_fine_to_pay, NULL)
     139        RETURNING punishment_id INTO new_punishment_id;
     140    END IF;
     141
     142END;
     143$$;
     144}}}
     145
     146=== 4. Складирана процедура за додавање на на нов AcademicReport објект за конкретен Person запис
     147{{{
     148CREATE OR REPLACE PROCEDURE insert_academic_report(
     149    IN param_person_id INT,
     150    IN param_institution_id INT,
     151    IN param_academic_field TEXT,
     152    IN param_description_of_report TEXT
     153)
     154    LANGUAGE plpgsql
     155as
     156$$
     157DECLARE
     158    new_report_id INT;
     159BEGIN
     160    IF NOT EXISTS (SELECT 1
     161                   FROM person
     162                   WHERE person_id = param_person_id) THEN
     163        RAISE EXCEPTION 'Person with ID % does not exist', param_person_id;
     164    END IF;
     165    IF NOT EXISTS (SELECT 1
     166                   FROM institution
     167                   WHERE institution_id = param_institution_id) THEN
     168        RAISE EXCEPTION 'Institution with ID % does not exist', param_institution_id;
     169    END IF;
     170
     171    INSERT INTO report (report_type, summary, created_at, person_id)
     172    VALUES ('Academic', param_description_of_report, CURRENT_TIMESTAMP, param_person_id)
     173    RETURNING report_id INTO new_report_id;
     174
     175    INSERT INTO academicreport (report_id, institution_id, academic_field, description_of_report)
     176    VALUES (new_report_id, param_institution_id, param_academic_field, param_description_of_report);
     177END;
     178$$;
     179}}}