我是SQL新手,我目前正在使用PostgreSQL。我有两个表,我主要使用这些表,每个表有大约4-5百万行。一,我们将其称为事务表,表具有一个到多个不同的ID事务,ID可以在主表中添加,删除或更新。另一个表称为注册表,每个ID都有一条记录,其中包含名称,地址,dob等。我需要通过事务表并根据“原因代码”将该记录插入到注册表中,更新注册表中该ID的记录,或从注册表中删除该记录。
我的计划是首先将最低ID的所有记录移动到“当前工作事务”表中,然后使用case语句查看“事务类型”字段的值并执行插入,删除,或更新。这将继续,直到所有记录从工作事务表中消失。每次使用case语句完成ID并完成所有事务时,它们将从当前工作事务中删除,只留下当前ID在事务表中工作。
我一直在研究这个函数,并且在创建函数时不会出现任何错误,但是当我执行它时,唯一发生的事情就是将记录移动到当前的事务表中。案件陈述似乎没有通过。
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;