`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()
调用中...
- 如果我使用格式
%L
,我会收到错误 “运算符不是唯一的:日期 + 未知”
- 如果我使用格式
%I
,我会收到错误 “列“P14d”不存在”
- 如果我使用格式
%s
,我会收到错误 “列“P14d”不存在”
我好像找到了 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;
$$
我正在更新现有的存储函数,处理两个附加参数并在需要时插入它们。在函数中,我使用对 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()
调用中...
- 如果我使用格式
%L
,我会收到错误 “运算符不是唯一的:日期 + 未知” - 如果我使用格式
%I
,我会收到错误 “列“P14d”不存在” - 如果我使用格式
%s
,我会收到错误 “列“P14d”不存在”
我好像找到了 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;
$$