Цикл в функции PL / Postgresql - PullRequest
       15

Цикл в функции PL / Postgresql

0 голосов
/ 26 ноября 2011

Мне нужна помощь, я пытаюсь найти причину повторения цикла при запуске этой функции.Он начинается снова после возврата «ОК» и не начинается с усечения таблицы.

CREATE OR REPLACE FUNCTION schema.table1()
  RETURNS character varying AS
$BODY$
DECLARE var schema.table2;
DECLARE s_doc text;

BEGIN

perform ssv('HTTPS', 'on');
perform ssv('SERVER_NAME', 'www.url.domain');
perform ssv('DAD', 'website');

truncate schema.table3;

for var in (
        select * from schema.table2
) loop
        if var.content like '<?xml version="1.0" encoding="UTF-8"?>\n<XMLDoc format="XMLDOC-XML"%' then
                insert into schema.table3 (id, doc)
                values (var.id, var.content);
        else
                begin
                        s_doc:='<?xml version="1.0" encoding="UTF-8"?>\n'||schema.doc2XMLDOC(var, '1');
                exception when others then
                        s_doc:=NULL;
                end;
                if s_doc is not null then
                        insert into schema.table3 (id, doc)
                        values (var.id, s_doc);
                end if;
        end if;
end loop;

return 'OK';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION schema.export_doc()
  OWNER TO sysadm;

1 Ответ

1 голос
/ 26 ноября 2011

Очевидно, что один из трех вызовов функций до truncate делает то, о чем вы нам не говорите:

perform ssv('HTTPS', 'on');
perform ssv('SERVER_NAME', 'www.url.domain');
perform ssv('DAD', 'website');

Редактировать: аудит кода

При ближайшем рассмотрении выявляется немало проблем:

  • В заголовке вы называете функцию schema.table1() (что является странным названием для функции), внизу вы ссылаетесь на schema.export_doc()?

  • У вас есть ключевое слово DECLARE дважды в заголовке функции. Вам нужно это только один раз. К моему удивлению, это не вызывает ошибку, хотя.

  • Если \n в

'<?xml version="1.0" encoding="UTF-8"?>\n<XMLDoc format="XMLDOC-XML"%'

предполагается интерпретировать как разрыв строки, тогда вы должны использовать правильный синтаксис для escape-констант :

E'<?xml version="1.0" encoding="UTF-8"?>\n<XMLDoc format="XMLDOC-XML"%'
  • Вы вызываете функцию schema.doc2XMLDOC(var, '1') дальше вниз. В смешанной записи? Вам известно, что идентификаторы приводятся к нижнему регистру , если не заключены в двойные кавычки в PostgreSQL? Я никогда не использую идентификаторы регистров миксов.

  • Блок исключений выглядит подозрительно. Почему вызываемая функция выдает ошибку?

begin
   ...
   exception when others then
      s_doc:=NULL;
end;

Существует количество тестов, которые вы можете запустить на своих данных , чтобы предотвратить это:

xml IS DOCUMENT
XMLEXISTS(...)
xml_is_well_formed()

Более чистая и, скорее всего, более быстрая, чем (медленная) обработка ошибок.

...