Postgresql 即使发生错误,如何保持循环?
我编写了一个PL/pgsql来批量创建表上的索引Postgresql 即使发生错误,如何保持循环?,postgresql,plpgsql,postgresql-9.3,Postgresql,Plpgsql,Postgresql 9.3,我编写了一个PL/pgsql来批量创建表上的索引 CREATE OR REPLACE FUNCTION create_index() RETURNS void AS $BODY$ DECLARE r INTEGER; BEGIN FOR r IN 1..1000 LOOP EXECUTE format( ' CREATE INDEX idx_abc_id_' || r::text || ' ON abc_id_' || r:
CREATE OR REPLACE FUNCTION create_index() RETURNS void AS
$BODY$
DECLARE
r INTEGER;
BEGIN
FOR r IN 1..1000
LOOP
EXECUTE format(
' CREATE INDEX idx_abc_id_' || r::text ||
' ON abc_id_' || r::text ||
' USING btree
(key);');
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
它有一个问题,如果分区abc_500不存在,那么how create index函数将失败,什么也不做
即使create_index在中间的一个表上出错,如何使循环继续进行?我认为更好的方法是不硬编码循环的编号,而是迭代现有的表:
CREATE OR REPLACE FUNCTION create_index() RETURNS void AS
$BODY$
DECLARE
r record;
BEGIN
FOR r IN select tablename, regexp_replace(tablename, '[^0-9]+','') as idx_nr
from pg_tables
where tablename ~ 'abc_id_[0-9]+'
LOOP
EXECUTE format('CREATE INDEX %I ON %I USING btree (key)',
'idx_abc_id_'||r.idx_nr,
r.tablename);
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
使用format()
函数时,最好为标识符使用正确的占位符
如果还希望在现有表上创建索引时忽略任何错误,则需要捕获异常并忽略它:
CREATE OR REPLACE FUNCTION create_index() RETURNS void AS
$BODY$
DECLARE
r record;
msg text;
BEGIN
FOR r IN select tablename, regexp_replace(tablename, '[^0-9]+','') as idx_nr
from pg_tables
where tablename ~ 'abc_id_[0-9]+'
LOOP
BEGIN
EXECUTE format('CREATE INDEX %I ON %I USING btree (key)',
'idx_abc_id_'||r.idx_nr,
r.tablename);
EXCEPTION
WHEN OTHERS THEN
GET STACKED DIAGNOSTICS msg = MESSAGE_TEXT;
RAISE NOTICE 'Could not create index for: %, %', r.idx_nr, msg;
END;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;