2012-07-23 187 views
4

我想請從我從更新規則調用的函數記錄變量一列,正在以下錯誤:選擇列從一個記錄變量(PostgreSQL的8.4)

「不可能在記錄數據類型」欄中標識「名」

以下是我在做什麼,以產生錯誤:

從更新規則中:

SELECT * INTO TEMPORARY TABLE TempTable FROM NEW; 
SELECT MyFunction(); 

從在MyFunction的()

DECLARE RecordVar Record; 
SELECT * INTO STRICT RecordVar FROM TempTable; 
EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar; 

注:我知道有更容易的方式來實現什麼上面的代碼實現,但我已經簡化了實際執行專注於我有問題,這開闢了其他可能的解決方案,但我真的想在上面的代碼工作,如果可能的話。

回答

4

我只是想通了。我不是將新列插入臨時表中,而是將新記錄作爲單個列插入到臨時表中,並將其作爲RecordVar引用。我的規則和功能現在這個樣子:

從更新規則中:

SELECT NEW AS "NEW" INTO TEMPORARY TABLE TempTable; 
SELECT MyFuction(); 

從MyFunction的()內

DECLARE RecordVar Record; 
SELECT * INTO STRICT RecordVar FROM TempTable; 
EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar."NEW"; 
2

第二部分可以像這樣工作:

DO 
$BODY$ 
DECLARE 
    RecordVar TempTable; 
BEGIN 
    SELECT * INTO STRICT RecordVar FROM TempTable LIMIT 1; 
    EXECUTE 'UPDATE AnotherTable SET column = $1.name' 
    USING RecordVar; 
END; 
$BODY$ 

注意我如何使用表名稱類型。 PostgreSQL自動爲系統中的每個表創建一個複合類型。

變量保存一行,SELECT可以返回許多行。除第一個之外的所有內容都將被丟棄。我加了LIMIT 1來澄清效果。我懷疑這是你想要的。

您可能不應該在規則中使用臨時表來開始。你可能想發佈你的完整設置...

+0

歐文你好,非常感謝您的回覆。我相信你的建議可以適用於一種情況,但我的問題是我有多個視圖,每個視圖都有我想要應用我的函數的自己的基礎表。如果我要將表指定爲RecordVar的類型,那麼我必須爲每種表類型創建一個函數,我希望避免這種情況。對不起,沒有在我原來的問題中包含這些信息。 – user1545610 2012-07-23 22:35:05

+0

關於我使用臨時表,我只是將它們用作一種機制,將規則內的NEW和OLD交換到我的函數,因爲您無法將數據類型記錄傳遞給函數。如果有更好的方法將NEW和OLD從規則傳遞給函數,那麼這樣做可能會導致解決我的問題。我不明白的一件事是爲什麼我可以使用NEW。 在規則或觸發器的上下文中知道NEW是記錄數據類型而不是RecordVar。 ,我已經從NEW實例填充。 – user1545610 2012-07-24 05:34:57

+0

我試過以下的組合,導致'記錄類型未被註冊'或'無法將類型記錄轉換爲

': EXECUTE'UPDATE AnotherTable SET column = $ 1.name'USING RecordVar :: Table; EXECUTE'UPDATE AnotherTable SET column = $ 1.name'USING ROW(RecordVar。*)::表; 我認爲下面的工作,但它也沒有工作: CREATE TEMPORARY TABLE YetAnotherTable(Like Table); INSERT INTO YetAnotherTable(SELECT * FROM TempTable); SELECT * FROM YetAnotherTable INTO RecordVar; EXECUTE'UPDATE AnotherTable SET column = $ 1.name'使用RecordVar :: YetAnotherTable; – user15456102012-07-24 08:15:59