使用format()执行INSERT会引发错误

时间:2016-11-03 19:51:40

标签: postgresql plpgsql dynamic-sql

尝试执行以下操作:

DO $$
BEGIN
EXECUTE format('INSERT INTO public."EWcfgvars" (idinstrum, varname, enable, subaddr, id_device, id_synchronization_request, pupdate) VALUES (4, %s, 1, 0, 122, 1, 1464022764);', 'test');
  END
$$;

我收到此错误:

[42703] ERROR: column "test" does not exist
 Where: PL/pgSQL function inline_code_block line 3 at EXECUTE statement

我的DDL出了什么问题?

3 个答案:

答案 0 :(得分:2)

占位符%s会将参数“原样”中的值放入字符串中。但是您希望将参数视为文字(常量)。

您需要使用占位符%L

format('.... (4, %L, 1, 0, 122, 1, 1464022764)', 'test')

对于execute,您也无需使用;

终止该语句

答案 1 :(得分:1)

@Olaf和@a_horse解释了你的问题。解决方案是:

无论

EXECUTE format($$
    INSERT INTO public."EWcfgvars" (idinstrum, varname, enable, subaddr, id_device, id_synchronization_request, pupdate) VALUES
    (4, %L, 1, 0, 122, 1, 1464022764);
    $$', 'test'
);

execute没有format

EXECUTE $$
    INSERT INTO public."EWcfgvars" (idinstrum, varname, enable, subaddr, id_device, id_synchronization_request, pupdate)
    VALUES (4, $1, 1, 0, 122, 1, 1464022764);
    $$ using 'test';

答案 2 :(得分:0)

  

我的DDL出了什么问题?

函数format根据某些printf样式格式字符串输出字符串。你的字符串

format('INSERT INTO public."EWcfgvars" (...) VALUES (4, %s, 1, 0, 122, 1, 1464022764);', 'test')

变为

INSERT INTO public."EWcfgvars" (...) VALUES (4, test, 1, 0, 122, 1, 1464022764);

这是一个插入语句,试图为第二个值插入列test的值。

要将test作为字符串插入,您可以尝试Dollar-quoted String Constants,例如

format('INSERT INTO public."EWcfgvars" (...) VALUES (4, %s, 1, 0, 122, 1, 1464022764);', $$'test'$$)