我想创建一个程序,它可以创建一个动态表名的表。它需要一个日期,格式和附加到表名。
我做了什么:
CREATE OR REPLACE PROCEDURE l2.accounts_balances_load(var_balancedate date)
LANGUAGE plpgsql
AS $procedure$
declare var_balancedate_ int = to_char(var_balancedate, 'YYYYMMDD') ;
begin
raise notice 'SQL:: %', var_balancedate_;
execute format ('create table if not exists l2.accounts_balances_%I partition of l2.accounts_balances', var_balancedate_);
end;
$procedure$
;
字符串
我打电话:
call l2.accounts_balances_load('2023-10-02');
型
但我得到错误:
SQL Error [42601]: ERROR: syntax error at or near ""20231002""
Где: PL/pgSQL function l2.accounts_balances_load(date) line 9 at EXECUTE
型
我做错了什么?
1条答案
按热度按时间1u4esq0p1#
在这种情况下,您需要格式说明符
%s
而不是%I
来表示format()
。例如:字符串
此外,没有必要强制将
var_balancedate_
的日期转换为int
,我将其转换为text
。指定符
%I
将输入视为标识符,如果字符串无效,则将其双引号。数字字符串将被双引号括起来。* 后续 * 串联构成非法名称。现在,您的表名 * 是 * 一个标识符,但您只是追加了数字。您必须将整个名称加上双引号。由于
var_balancedate_
被分配了to_char()
的结果,因此我们知道字符串是安全的,因此不可能有SQL注入,并且%s
很好。否则,您将连接整个表名,并将其与
%I
说明符一起传递,以将其作为一个整体引用。相关信息: