use*_*447 4 sql postgresql execute sql-insert postgresql-9.3
我想创建一个函数来更新表。
我正在尝试运行它:
SELECT insert_function('asda', 1 ,1 , 'asd', 1)
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
LINE 3 VALUES("asda","1","1","asd","1") 列不存在。
当我尝试 rot 运行时:
SELECT insert_function('1', 1 ,1 , '1', 1)在 """"""" 附近的零长度分隔标识符第 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;
Run Code Online (Sandbox Code Playgroud)
你能告诉我如何插入值吗?我该如何编写函数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;
Run Code Online (Sandbox Code Playgroud)
你有两个问题:
当您想要插入表时,您必须指定所有列(甚至是自动计算列),或者如果您不想指定所有列名称,则必须指定所有列值,甚至是自动计算值。
关于动态查询的格式,您应该使用%s而不是%I将相应的参数插入为您想要实现的字符串,并将%I其参数转义为您不希望的 SQL 标识符。
因此,您可以通过替换来解决您的问题:
EXECUTE format('
INSERT INTO commits
VALUES(%I, %I, %I, %I, %I)',
goo , foo , bla , ma , fgt );
Run Code Online (Sandbox Code Playgroud)
经过
EXECUTE format('
INSERT INTO commits
VALUES(DEFAULT, %L , %s , %s , %L , %s )',
goo , foo , bla , ma , fgt );
Run Code Online (Sandbox Code Playgroud)