【问题标题】:Getting the number of the rows affected by update or insert获取受更新或插入影响的行数
【发布时间】:2014-06-11 14:05:32
【问题描述】:

我需要检查更新或插入影响了多少行(实际上,目前仅更新)。我创建了以下函数:

CREATE OR REPLACE FUNCTION rows_affected()
  RETURNS integer AS
$BODY$

DECLARE
    x INTEGER := -1;
BEGIN
    GET DIAGNOSTICS x = ROW_COUNT;
    RETURN x;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION rows_affected()
  OWNER TO alex1;

然后我更新了一个表并调用了这个函数,结果为零。然后我插入一行并一次又一次地调用该函数,结果为零。怎么了?以及如何正确检查受更新或插入影响的行数?

更新:

这不像我预期的那样工作,而是总是返回 0 作为受影响的行数:

SELECT rows_affected();

update email set email='fdsfds' where id = 1;

insert into email(email) values('fdsfsdfdsfds');

SELECT rows_affected();

【问题讨论】:

    标签: sql postgresql postgresql-9.2


    【解决方案1】:

    当调用函数/触发器时,会创建新的内部执行状态结构 (PLpgSQL_execstate),并将 ROW_COUNT 值(eval_processed 属性)设置为 0。因此,在函数内部,您只能为同一函数内部的语句获取 ROW_COUNT。作为一种解决方法,您可以将 sql 语句作为文本参数传递给此过程并在内部执行。

    【讨论】:

    • 这是否意味着我只能在其他函数中调用 ROW_COUNT ?请看我的更新。
    • 您可以在任何地方调用它,但是如果您在函数内部获得 ROW_COUNT,那么您将获得在该函数范围内受影响的记录数,而不是在外部。因此,当您查询“SELECT rows_affected();”时在您的示例中,创建了此函数的新执行上下文,并且其 ROW_COUNT 统计信息默认设置为 0。此函数不会更改任何行,您将始终获得此默认零值。
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2013-06-23
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多