Функция PostgreSQL с оператором case - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в функциях SQL, и в настоящее время я работаю с PostgreSQL.У меня есть две таблицы, с которыми я в основном работаю, и каждая таблица содержит около 4-5 миллионов строк.Во-первых, мы назовем это таблицей транзакций, таблица имеет одну-много разных транзакций для идентификатора, идентификатор мог быть добавлен, удален или обновлен в основной таблице.Другая таблица, называемая таблицей регистрации, имеет одну запись для каждого идентификатора, которая имеет имя, адрес, dob и т. Д. Мне нужно просмотреть таблицу транзакций и в зависимости от «кода причины» либо вставить эту запись в таблицу регистрации,обновите запись этого идентификатора в таблице регистрации или удалите запись из таблицы регистрации.

Мой план состоял в том, чтобы сначала переместить все записи с наименьшим идентификатором в таблицу «текущая рабочая транзакция», а затем использовать инструкцию case, чтобы посмотреть значение поля «тип транзакции» и выполнить либовставить, удалить или обновить.Это будет продолжаться до тех пор, пока все записи не будут удалены из рабочей таблицы транзакций.Каждый раз, когда идентификатор заканчивался оператором case и проходил все транзакции, он удалялся из текущих рабочих транзакций, оставляя в таблице транзакций только текущий идентификатор.

Я работал над этой функцией и не получаю никаких ошибок при ее создании, но когда я ее выполняю, единственное, что происходит, - это перемещение записей в текущую таблицу транзакций.Похоже, что дело не проходит.

CREATE OR REPLACE FUNCTION makeUpdates() RETURNS VOID AS $$
DECLARE
    code VARCHAR := (SELECT reasoncode FROM current_working_trans);
BEGIN
    LOOP
        INSERT INTO current_working_trans 
            SELECT * FROM test_working_trans 
            WHERE identification_number = (SELECT MIN(identification_number) FROM test_working_trans);
        DELETE FROM test_working_trans
            WHERE identification_number = (SELECT MIN(identification_number) FROM test_working_trans);

        CASE
            WHEN code IN('NEW','REACTIVATE','TRANSFER IN','REINSTATE','CHANGE IN') THEN
                    INSERT INTO registration_table
                        (sourceid, lastname, firstname, middlename, namesuffix, reghousenum, reghousesfx, regstname, regsttype, 
                         regstpost, regunitnumber, regcity, regsta, regzip5, registrationaddr1, registrationaddr2, county_fips, 
                         jurisname, precinct, precinctname, cd_nextelection, sd_next_election, ld_nextelection, sex, birthyear, 
                         birthmonth, birthday, registrationdate, mailingaddr1, mailingaddr2, mailcity, mailsta, mailzip5)
                    SELECT identification_number, last_name, first_name, middle_name, suffix, house_number, housenumbersuffix, 
                    street_name, streettypecodename, post_direction, apt_num, city, state, zip::int, address_line_1, address_line_2, 
                    locality_code::int, localityname, precinct_code_value, precinctname, cong_code_value::int, stsenate_code_value::int, 
                    sthouse_code_value::int, gender, EXTRACT(year FROM dob), EXTRACT(month FROM dob), EXTRACT(day FROM dob), 
                    registration_date, mailing_address_line_1, mailing_address_line_2, mailing_city, mailing_state, LEFT(mailing_zip, 5)    
                    FROM current_working_trans;
                    --ADD ON CONFLICT STATEMENT FOR IF IT'S ALREADY DONE
                    DELETE FROM current_working_trans WHERE reasoncode = code;
            WHEN code IN('INACTIVE','ACTIVE CANCEL','DECLARED NON-CITIZEN','INELIGIBLE','OUT OF STATE','MENTALLY INCAPACITATED',
                  'INACTIVE CANCEL - PURGE','CHANGE OUT','FELON','REGISTRAR ERROR','TRANSFER OUT','DECEASED','INACTIVE CANCEL - OTHER',
                  'PER CHOICE') THEN
                    INSERT INTO deletions
                    SELECT * FROM registration_table
                    WHERE registration_table.sourceid = current_working_trans.identification_number;
                    DELETE FROM registration_table WHERE registration_table.sourceid = current_working_trans.identification_number;
                    DELETE FROM current_working_trans WHERE reasoncode = code;
            WHEN code = 'NAME CHANGE' THEN 
                    UPDATE registration_table
                    SET firstname = current_working_trans.first_name,
                        lastname = current_working_trans.last_name,
                        middlename = current_working_trans.middle_name,
                        namesuffix = current_working_trans.suffix
                    FROM current_working_trans
                    WHERE sourceid = identification_number; 
                    DELETE FROM current_working_trans WHERE reasoncode = code; 
            ELSE 
                INSERT INTO deletions (firstname, lastname) SELECT first_name, last_name FROM current_working_trans;
        END CASE;
        EXIT WHEN NOT FOUND;
    END LOOP; 
END;
$$
LANGUAGE plpgsql;
...