Форматировать интервал типа даты как параметр в функции PostgreSQL

Как лучше всего параметризовать интервальный тип даты в функции PostgreSQL ?. У меня есть следующая функция

      CREATE OR REPLACE FUNCTION testing(
min_time integer
) 
RETURNS void AS
$BODY$
BEGIN
 EXECUTE format('CREATE TABLE foo AS
 SELECT
     gid,
     now() + concat(%s, ' hours')::interval as x,

  FROM foobar
  limit 3  ',min_time  );

 END;
$BODY$
LANGUAGE plpgsql;

Каждый раз, когда я пытаюсь выполнить функцию, я получаю следующую ошибку ERROR: syntax error at or near "hours"

1 ответ

Одинарные кавычки должны быть экранированы в строке:

      CREATE OR REPLACE FUNCTION testing(min_time integer) RETURNS void
   LANGUAGE plpgsql AS
$BODY$
BEGIN
   EXECUTE format(
              'CREATE TABLE foo AS
               SELECT gid,
                      now() + ''%s hours''::interval as x
               FROM foobar
               limit 3',
              min_time
           );
END;
$BODY$;

Но на самом деле вам не нужен динамический SQL для этого, и статический SQL может быть лучшим выбором:

      CREATE OR REPLACE FUNCTION testing(min_time integer) RETURNS void
   LANGUAGE plpgsql AS
$BODY$
BEGIN
   CREATE TABLE foo (
      gid bigint NOT NULL,
      x timestamp with time zone NOT NULL
   );

   INSERT INTO foo
   SELECT gid,
          now() + min_time * '1 hour'::interval
   FROM foobar
   limit 3;
END;
$BODY$;
Другие вопросы по тегам