2015-11-20 65 views
2

我想創建一個函數來更新表。INSERT EXECUTE FORMAT Postgresql字符串

我試圖運行它:

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(大寫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