插入执行格式 Postgresql 字符串
INSERT EXECUTE FORMAT Postgresql string
我想创建一个函数来更新 table。
我正在尝试 运行 它:
SELECT insert_function('asda', 1 ,1 , 'asd', 1)
但我收到错误消息:
LINE 3 VALUES("asda","1","1","asd","1") column doesn't exist.
当我尝试腐烂时 运行:
SELECT insert_function('1', 1 ,1 , '1', 1)
zero-length delimited
identifier at near """""""
LINE 3 VALUES(""1"","1","1",""1"","1")
(^at the first item)
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(,,,,);') using goo, foo, bla, ma, fgt;
END
$func$ LANGUAGE plpgsql;
%I(大写 i)格式化程序将参数转义为 SQL 标识符 (docs here),这不是您想要的。在这种情况下,您应该使用 %s。
EXECUTE format('INSERT INTO commits VALUES(%L, %s, %s, %L, %s)', goo , foo , bla , ma , fgt );
你有两个问题:
当你想要 insert into table 时,你必须指定所有列(甚至是自动计算的列),或者如果你不想要指定所有列名,您必须指定所有列值,甚至自动计算值。
关于动态查询的格式,您应该使用 %s
instead of %I
to interpolates the corresponding argument as a string which you want to achieve, and the %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 );
我想创建一个函数来更新 table。
我正在尝试 运行 它:
SELECT insert_function('asda', 1 ,1 , 'asd', 1)
但我收到错误消息:
LINE 3 VALUES("asda","1","1","asd","1") column doesn't exist.
当我尝试腐烂时 运行:
SELECT insert_function('1', 1 ,1 , '1', 1)
zero-length delimited identifier at near """""""LINE 3 VALUES(""1"","1","1",""1"","1") (^at the first item)
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(,,,,);') using goo, foo, bla, ma, fgt;
END
$func$ LANGUAGE plpgsql;
%I(大写 i)格式化程序将参数转义为 SQL 标识符 (docs here),这不是您想要的。在这种情况下,您应该使用 %s。
EXECUTE format('INSERT INTO commits VALUES(%L, %s, %s, %L, %s)', goo , foo , bla , ma , fgt );
你有两个问题:
当你想要 insert into table 时,你必须指定所有列(甚至是自动计算的列),或者如果你不想要指定所有列名,您必须指定所有列值,甚至自动计算值。
关于动态查询的格式,您应该使用 %s
instead of %I
to interpolates the corresponding argument as a string which you want to achieve, and the %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 );