INSERT EXECUTE FORMAT Postgresql字符串

时间:2015-11-20 14:43:14

标签: sql postgresql sql-insert postgresql-9.3 execute

我想创建一个更新表的函数。

我正在尝试运行它:

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编写函数?

3 个答案:

答案 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 );