尝试执行以下操作:
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出了什么问题?
答案 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'$$)