Я новичок в функциях 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;