2016-05-12 99 views
0

我在Postgres中創建了一個存儲過程。它將從表Messages獲取最大值message_id,並將其存儲在MessageID列中的另一個表(MaxMessageID)中。在Postgres中沒有函數的結果

這裏是我的存儲過程:

CREATE OR REPLACE FUNCTION MaxId() 
RETURNS integer AS $MID$ 
declare 
    MID integer; 
BEGIN 
    DELETE FROM MaxMessageID; 
    INSERT INTO MaxMessageID(MessageID) 
     SELECT MAX(MESSAGE_ID) FROM Messages; 
    RETURN MID; 
END; 
$MID$ LANGUAGE plpgsql; 

運行此程序後,MAX(MESSAGE_ID)應存放在MaxMessageID(郵件ID)。

當我運行的程序,檢查下面的命令:

Select * from MaxMessageID 

shows this。但是當我打電話給Select MaxId(),​​。

我錯過了什麼?

+0

「消息」是什麼? 你可以顯示'SELECT MAX(MESSAGE_ID)FROM消息的輸出;'? –

+0

@MichaelAmbrose,看到這裏的輸出http://prnt.sc/b37smr – Kate

+0

接下來我會嘗試,看看問題是功能本身還是查詢。當你運行INSERT INTO MaxMessageID(MessageID)SELECT MAX(MESSAGE_ID)FROM Messages;'?後續運行應該繼續向MaxMessageID添加行。 –

回答

0

我在Postgres中創建了一個存儲過程。

Postgres沒有「存儲過程」。只有功能,做差不多,但不完全一樣:

...當我檢查我的輸出表

如何你檢查什麼呢?你的功能是要在任何情況下返回NULL:

RETURN MID; 

而且MID從未分配。你的回報價值目前沒有意義。

通過查看目標表MaxMessageIDSELECT * FROM MaxMessageID進行檢查。如果你看到一個單行maxmessageid IS NULL,有兩種可能的解釋:

  1. message_id列在表messages沒有價值。然後結果是設計。

  2. 您正在混淆表名或列名。你的不加引號的CaMeL-case標識符是可疑的。您是否知道Postgres標識符是區分大小寫

    而且可以有多個模式在Postgres數據庫:

+0

我理解你的概念,但我唯一的擔心,爲什麼是沒有獲取表MaxMessageID的列message_id中的值。我正在調用像這樣的過程Select MaxId();我個人的查詢工作正常...我錯過任何東西來獲得所需的結果? – Kate

+0

@Kate:沒有列'message_id'。似乎有一個「MaxMessageID」,「MessageID」或「maxmessageid.messageid」,具體取決於您是否在創建時使用了雙引號。我的建議是專門使用合法的,小寫的,不加引號的標識符來避免這種混淆。按照我提供的鏈接閱讀關於標識符的手冊。 –

+0

我會小心地調用Postgres標識符區分大小寫。如果使用雙引號,則區分大小寫。如果她使用無效標識符,她會得到錯誤,而不是空響應。 –