在Postgres中没有函数的结果

问题描述:

我在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添加行。 –

我在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标识符区分大小写。如果使用双引号,则区分大小写。如果她使用无效标识符,她会得到错误,而不是空响应。 –