我正在更新一个现有的存储函数,处理两个额外的参数,并在需要时插入它们。在函数中,我使用对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