Postgresql 即使发生错误,如何保持循环?

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:

我编写了一个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::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;