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



我正在更新一个现有的存储函数,处理两个额外的参数,并在需要时插入它们。在函数中,我使用对EXECUTE format()的调用将一行INSERT放入表中,类似于。。。

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()调用中。。。

  • 如果我使用格式%L;运算符不是唯一的:日期+未知">
  • 如果我使用格式CCD_ 5;列";P14d";不存在">
  • 如果我使用格式CCD_ 6;列";P14d";不存在">

不要将字符串作为参数传递,使用占位符并传递正确的数据类型。仅使用标识符的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($1, $2, $3) d
CROSS JOIN table_1', p_name, p_step)
using current_date, current_date + p_project_duration, interval '1 day';
END;
$$

我似乎找到了一个破解补丁/cludege/bodge,耶!

如果我使用"%s"格式,然后将其强制转换为INTERVAL,它就会起作用。

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

最新更新