2015-11-20 4 views
2

Я хочу создать функцию, которая обновит таблицу.INSERT EXECUTE FORMAT Postgresql string

Я пытаюсь запустить его:

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?

ответ

1

Specyfy имена столбцов и использовать 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

+0

@ user565447 Проверить обновленные – lad2025

1

Значение% I (в верхнем регистре я) форматировщик избегает аргумент в качестве идентификатора SQL (docs here), который не то, вы хотите. Вы должны использовать% s в этом случае.

EXECUTE format('INSERT INTO commits VALUES(%L, %s, %s, %L, %s)', goo , foo , bla , ma , fgt); 
+0

Спасибо за объяснение! – user565447

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); 
+0

Спасибо за разъяснение! Теперь я вижу – user565447