2015-06-11 57 views
0

我試圖更新我創建的臨時表中的字段。Postgresql:在plpgsql的臨時表上執行更新不起作用

對臨時表中的代碼如下所示:

CREATE OR REPLACE FUNCTION insertTable() 
RETURNS VOID AS $$ 
BEGIN 
execute 'create temporary table myTable (id INTEGER, value TEXT) on commit preserve rows'; 
execute 'insert into myTable values(1, NULL)'; 
end if; 
end; 
$$ LANGUAGE plpgsql; 

接下來,我嘗試更新具有以下功能提交的值:

CREATE OR REPLACE FUNCTION setValue (msg TEXT) 
RETURNS VOID AS $$ 
BEGIN 
EXECUTE format('UPDATE myTable SET value = value || $1 WHERE id = '|| quote_literal(1))USING msg; 
END; 
$$ LANGUAGE plpgsql; 

但是它不工作和值字段保持空着。

我嘗試了與已有的表(不是臨時)相同的代碼,代碼按預期工作。

我搜索了更新臨時表和普通表之間的差異,但找不到任何文件。 我希望你能幫助我。

在此先感謝您的幫助。

編輯:編輯表的名稱

+1

您是通過同一物理連接,因此調用第二個函數作爲第一個?如果你從兩個不同的會話做到這一點,當然第二個不會看到第一個插入的數據 –

回答

0

該問題與臨時表無關。問題是您要更新的列實際上是空的。您嘗試通過將列的值與另一個文本連接來更新此列,但由於該值本身爲空,因此連接的值也爲空。

這個查詢:

SELECT null||'some text'; 

返回null。此更新聲明:

UPDATE xmlBuffer SET value = value || 'some text'; 

將不會更新實際內容爲空的行。您可以通過多種方式解決此問題,具體取決於您的需要。在例如,你可以使用COALESCE聲明的第二個功能,使用空字符串作爲後備值(此外,quote_literalformat聲明是沒有必要的):

CREATE OR REPLACE FUNCTION setValue (msg TEXT) 
RETURNS VOID AS $$ 
BEGIN 
    EXECUTE 'UPDATE xmlBuffer SET value = COALESCE(value,'''') || $1 WHERE id = '|| 1 
    USING msg; 
END; 
$$ LANGUAGE plpgsql; 
+0

它的工作,謝謝。我不知道你不能連接一個NULL值與一個NOT NULL值。謝謝你的幫助。 – user3906778