我有一个 postgresql v8.4 数据库。我需要更新数百个表,每个表包含大约 300 万行数据。
客户想要添加一个新列(我添加的),现在我正在尝试用数据更新新列。
我创建了一些 SQL 语句来进行更新。如果我在 pgAdmin 中手动运行它(只是 sql 语句),这会起作用;所以我试着把它放到一个函数中来自动更新,就像这样:
CREATE or REPLACE function update_ee() RETURN void as
$$
DECLARE
row RECORD;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' and tablename like '%_2015060%' order by tablename asc;
LOOP
RAISE LOG 'removing index for %', row.tablename;
-- remove indices
EXECUTE 'DROP INDEX ' || row.tablename || '_start_idx;';
RAISE LOG 'starting update on %', row.tablename;
-- update table
EXECUTE 'UPDATE ' || row.tablename || ' set ee = array_to_string(regexp_matches(xml_data, ''<EE_ID>(.+?)</EE_ID>''), '';'') where elnot is NULL and xml_data is not null;';
RAISE LOG 'restoring index on %', row.tablename;
-- put indices back
EXECUTE 'CREATE INDEX ' || row.tablename || '_start_idx on ' || row.tablename || ' USING btree(start);';
END LOOP;
RETURN;
END;
$$
LANGUAGE plpgsql;
所以函数运行;每个连续的表的更新往往会慢一点;日志语句都出现在日志文件中。它似乎在工作;但完成后没有一张桌子被更新。
我做错了什么?
无法从函数更新表吗?语言有错吗?我应该使用 SQL 而不是 plsql 吗?
提前致谢...