INSERT EXECUTE格式字符串PostgreSQL的

问题描述 投票:2回答:3

我要创建将更新表的功能。

我试图运行它:

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功能?

sql postgresql sql-insert postgresql-9.3 execute
3个回答
4
投票

指定列名和使用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


3
投票

你有两个问题:

当你想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 );

1
投票

将%I(大写i)格式逃脱参数作为一个SQL标识符(docs here),这是不是你想要的。你应该在这种情况下使用%S。

EXECUTE format('INSERT INTO commits VALUES(%L,  %s,  %s,  %L, %s)', goo , foo , bla , ma , fgt );
© www.soinside.com 2019 - 2024. All rights reserved.