插入执行格式 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;

SqlFiddleDemo

%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 );