【问题标题】:Getting no result from function in Postgres从 Postgres 中的函数中没有得到任何结果
【发布时间】:2016-05-12 15:16:02
【问题描述】:

我在 Postgres 中创建了一个存储过程。即将从表Messages 中获取message_id 的最大值并存储在MessageID 列中的另一个表(MaxMessageID) 中。

这是我的存储过程:

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(MessageID) 中。

当我运行程序并检查以下命令时:

  Select * from MaxMessageID

shows this。但是当我用Select MaxId()it shows this调用程序时。

我错过了什么?

【问题讨论】:

  • Messages 中有什么内容?你能显示SELECT MAX(MESSAGE_ID) FROM Messages;的输出吗?
  • @MichaelAmbrose,看到这里是输出prnt.sc/b37smr
  • 接下来我会尝试看看问题是函数本身还是查询。当您运行 INSERT INTO MaxMessageID(MessageID) SELECT MAX(MESSAGE_ID) FROM Messages; 时会发生什么?后续运行应继续向 MaxMessageID 添加行。
  • 第一:你的函数中分配给MID变量的值在哪里?
  • 第二个是有道理的。你应该得到空值,因为你没有给MID赋值。您可以将SELECT INTO MID MAX(MESSAGE_ID) FROM Messages; raise notice '%', MID; 添加到您的函数中并再次运行它吗?

标签: postgresql stored-procedures plpgsql


【解决方案1】:

我在 Postgres 中创建了一个存储过程。

Postgres 没有“存储过程”。只有功能,做的差不多但不完全相同:

...当我检查我的输出表时

如何准确检查?在任何情况下,您的函数都将返回 NULL:

RETURN MID;

并且从未分配过MID。到目前为止,您的返回值没有意义。

通过查看目标表MaxMessageIDSELECT * FROM MaxMessageID 进行检查。如果您看到有maxmessageid IS NULL 的单行,有两种可能的解释:

  1. messages 中的列 message_id 中没有值。然后结果是设计使然。

  2. 您混淆了表名或列名。您未引用的 CaMeL 案例标识符以这种方式可疑。您是否知道 Postgres 标识符区分大小写

    Postgres 数据库中可以有多个模式

【讨论】:

  • 我理解你的概念,但我唯一关心的是,为什么没有得到表 MaxMessageID 的列 message_id 中的值。我正在调用这样的过程 Select MaxId();我的个人查询工作正常......我是否遗漏了任何东西来获得所需的结果?
  • @Kate:没有列message_id。似乎有"MaxMessageID"."MessageID"maxmessageid.messageid,这取决于您在创建它时是否使用了双引号。我的一贯建议是专门使用合法的、小写的、未加引号的标识符来避免任何此类混淆。按照我提供的链接阅读有关标识符的手册。
  • 我会小心调用 Postgres 标识符区分大小写。如果它们在双引号中,则它们区分大小写。如果她使用无效的标识符,她会收到错误,而不是空响应。
  • @MichaelAmbrose:或者有两个(或更多)表。
  • 很公平。我可能不应该认为这是一个完全干净的环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2013-11-25
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多