我想创建一个更新表的函数。
我正在尝试运行它:
SELECT insert_function('asda', 1 ,1 , 'asd', 1)
但我收到错误:
第3行(" asda"," 1"," 1"," asd"," 1&#34 ;)列不存在。
当我尝试腐烂时:
SELECT insert_function('1', 1 ,1 , '1', 1)
零长度分隔 标识符位于"""""""第3行("" 1""," 1"" 1""" 1""" 1&#34) (^在第一项)
CREATE TABLE IF NOT EXISTS commits (
id SERIAL PRIMARY KEY,
goo CHAR(64) NOT NULL,
foo INTEGER NOT NULL,
bla INTEGER NOT NULL,
ma CHAR(512) NOT NULL,
fgt INTEGER NOT NULL
);
CREATE OR REPLACE FUNCTION insert_function(goo char(64), foo INTEGER, bla INTEGER, ma CHAR(512), fgt INTEGER)
RETURNS VOID AS
$func$
BEGIN
EXECUTE format('
INSERT INTO commits
VALUES(%I, %I, %I, %I, %I)',
goo , foo , bla , ma , fgt );
END
$func$ LANGUAGE plpgsql;
您能否告诉我如何插入值?如何用EXECUTE format
编写函数?
答案 0 :(得分:3)
指定列名称并使用using
:
CREATE OR REPLACE FUNCTION insert_function(goo char(64), foo INTEGER,
bla INTEGER, ma CHAR(512), fgt INTEGER)
RETURNS VOID AS
$func$
BEGIN
EXECUTE format('INSERT INTO commits(goo, foo, bla, ma, fgt)
VALUES($1,$2,$3,$4,$5);') using goo, foo, bla, ma, fgt;
END
$func$ LANGUAGE plpgsql;
的 SqlFiddleDemo
强>
答案 1 :(得分:2)
你有两个问题:
如果您想要 insert into 表,则必须指定所有列(甚至是自动计算的列),或者如果您不想指定所有列名称,你必须指定所有列值,甚至是自动计算的值。
关于动态查询的格式,您应该使用%s
而不是%I
将相应的参数插入到您想要实现的字符串中,并且%I
转义其参数作为您不想要的SQL标识符。
所以你可以通过替换来解决你的问题:
EXECUTE format('
INSERT INTO commits
VALUES(%I, %I, %I, %I, %I)',
goo , foo , bla , ma , fgt );
通过
EXECUTE format('
INSERT INTO commits
VALUES(DEFAULT, %L , %s , %s , %L , %s )',
goo , foo , bla , ma , fgt );
答案 2 :(得分:1)
%I(大写i)格式化程序将参数作为SQL标识符(docs here)进行转义,这不是您想要的。在这种情况下,您应该使用%s。
EXECUTE format('INSERT INTO commits VALUES(%L, %s, %s, %L, %s)', goo , foo , bla , ma , fgt );