Как передать переменную в to_char () - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать функцию для удаления записей старше определенного количества дней.

CREATE OR REPLACE FUNCTION delete_records(num_days int)
RETURNS void AS 
$BODY$
DECLARE 
   DATE timestamp; 
   sqlsatement text; 
BEGIN 
  select to_char((now() - interval 'num_days  day'), 'YYYY-MM-DD') into DATE;
  sqlsatement  := format ('DELETE FROM A_Table WHERE A_DATE < ''%s''', DATE)
  EXECUTE sqlsatement  ;
END; 
$BODY$
LANGUAGE plpgsql;

Ошибка:

postgres=# select delete_records(89);
ERROR:  invalid input syntax for type interval: "num_days  day"
LINE 1: select to_char((now() - interval 'num_days  day'), 'YYYY-MM-...
                                         ^

1 Ответ

3 голосов
/ 03 марта 2020

Не следует преобразовывать временную метку в varchar, если вы планируете сохранить ее в переменной timestamp (а затем сравнить ее со столбцом временной метки).

Чтобы сгенерировать интервал дней на основе параметра, вы можете использовать функцию make_interval():

date := current_timestamp - make_interval(days => num_days);

Но вы слишком усложняете вещи. Вам не нужны переменные или динамические c SQL:

CREATE OR REPLACE FUNCTION delete_records(num_days int)
RETURNS void AS 
  DELETE FROM A_Table 
  WHERE A_DATE < current_timestamp - make_interval(days => num_days);
$BODY$
LANGUAGE sql;

Если вы упростили свой пример и вам действительно очень нужны динамические c SQL, не объединяйте значения в строку:

CREATE OR REPLACE FUNCTION delete_records(num_days int)
RETURNS void AS 
$BODY$
DECLARE 
   sqlsatement text; 
BEGIN 
  sqlsatement := 'DELETE FROM A_Table WHERE A_DATE < $1'
  EXECUTE sqlsatement 
    using current_timestamp - make_interval(days => num_days);
END; 
$BODY$
LANGUAGE plpgsql;

(я нахожу переменную с именем date с типом timestamp очень запутанная)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...