`format()` 调用中 `INTERVAL` 参数的格式是什么

What is the format for an `INTERVAL` parameter in a `format()` call

我正在更新现有的存储函数,处理两个附加参数并在需要时插入它们。在函数中,我使用对 EXECUTE format() 的调用将 INSERT 一行插入 table,类似这样...

CREATE OR REPLACE PROCEDURE function_p (
    p_name              TEXT        DEFAULT '',
    p_step              INT         DEFAULT NULL,
    p_project_duration  INTERVAL    DEFAULT '2W',
    )
LANGUAGE plpgsql AS $$
BEGIN
  EXECUTE format('
    INSERT INTO table_2 (column_1, column_2, column_3, name, step)
        SELECT one_column, two_column, three_column, %L, %s
            FROM generate_series(now()::DATE, now()::DATE + %L, INTERVAL ''1 day'') d
            CROSS JOIN table_1',
    p_name, p_step, p_project_duration);   
END;
$$

我知道这是一个非常垃圾的例子,但它是伪代码,好吗?! ;)

generate_series()调用中...

我好像找到了 hack-fix/cludge/bodge,耶!

如果我使用“%s”格式然后将其转换为 INTERVAL,它会起作用。

            FROM generate_series(now()::DATE, now()::DATE + ''%s''::INTERVAL, INTERVAL ''1 day'') d

不要将字符串作为参数传递,使用占位符并传递正确的数据类型。标识符仅使用 format() 占位符,使用 execute 命令的 using 子句传递实际参数:

CREATE OR REPLACE PROCEDURE function_p (
    p_name              TEXT        DEFAULT '',
    p_step              INT         DEFAULT NULL,
    p_project_duration  INTERVAL    DEFAULT '2W',
    )
LANGUAGE plpgsql AS $$
BEGIN
  EXECUTE format('
    INSERT INTO table_2 (column_1, column_2, column_3, name, step)
    SELECT one_column, two_column, three_column, %L, %s
    FROM generate_series(, , ) d
      CROSS JOIN table_1', p_name, p_step)
    using current_date, current_date + p_project_duration, interval '1 day';
END;
$$