我要创建将更新表的功能。
我试图运行它:
SELECT insert_function('asda', 1 ,1 , 'asd', 1)
但我得到的错误:
LINE 3个VALUES( “ASDA”, “1”, “1”, “ASD”, “1”)的列不存在。
当我试图腐运行:
SELECT insert_function('1', 1 ,1 , '1', 1)
零长度在接近“”“”“分隔标识符”,”LINE 3个VALUES( “” 1 “”, “1”, “1”, “” 1 “”, “1”)(^在中的第一项)
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
功能?
指定列名和使用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;
你有两个问题:
当你想insert into表,你必须指定所有列(甚至自动计算列),或者如果你不想指定所有列的名字,你必须指定所有列的值,即使汽车calcluated太超值了。
关于你的动态查询的格式,你应该使用%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 );
将%I(大写i)格式逃脱参数作为一个SQL标识符(docs here),这是不是你想要的。你应该在这种情况下使用%S。
EXECUTE format('INSERT INTO commits VALUES(%L, %s, %s, %L, %s)', goo , foo , bla , ma , fgt );