计算受 DELETE 影响的行数

问题描述 投票:0回答:2

我用这段代码来验证

DELETE
这句话,但我相信你知道更好的方法:

CREATE OR REPLACE FUNCTION my_schema.sp_delete_row_table(table_name character varying
                                                       , id_column character varying
                                                       , id_value integer)
  RETURNS integer AS
$BODY$
  DECLARE
    BEFORE_ROWS integer;
    AFTER_ROWS integer;
  BEGIN
    EXECUTE 'SELECT count(*) FROM ' || TABLE_NAME INTO BEFORE_ROWS;
    EXECUTE 'DELETE FROM ' || TABLE_NAME || ' WHERE ' || ID_COLUMN || ' = ' || (ID_VALUE)::varchar;
    EXECUTE 'SELECT count(*) FROM ' || TABLE_NAME INTO AFTER_ROWS;

    IF BEFORE_ROWS - AFTER_ROWS = 1 THEN
      RETURN 1;
    ELSE
      RETURN 2;
    END IF;
  EXCEPTION WHEN OTHERS THEN
    RETURN 0;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

如何改进这段代码?我需要它在 Postgres 8.4、9.1 和 9.2 中工作。

sql postgresql plpgsql postgresql-9.1 postgresql-9.2
2个回答
1
投票

您不能将

FOUND
EXECUTE
一起使用。 手册

特别注意

EXECUTE
改变了
GET DIAGNOSTICS
的输出, 但不会改变
FOUND

还有更多问题,最重要的是允许 SQL 注入。我建议:

CREATE OR REPLACE FUNCTION my_schema.sp_delete_row_table(table_name regclass
                                                       , id_column  text
                                                       , id_value   int
                                                       , OUT del_ct int)
  LANGUAGE plpgsql AS
$func$
BEGIN
   EXECUTE format('DELETE FROM %s WHERE %I = $1', table_name, id_column);
   USING id_value;                      -- assuming integer columns

   GET DIAGNOSTICS del_ct = ROW_COUNT;  -- directly assign OUT parameter

EXCEPTION WHEN OTHERS THEN
   del_ct := 0;
END
$func$;

要正确引用列名称,请使用

format()
或与
quote_ident()
!

进行字符串连接

相关:


-1
投票

查看名为

found
row_count
的变量:

http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATMENTS-DIAGNOSTICS

如果有任何行受到影响,则

found
为 true。
row_count
为您提供受影响的行数。

IF FOUND THEN
  GET DIAGNOSTICS integer_var = ROW_COUNT;
END IF;
© www.soinside.com 2019 - 2024. All rights reserved.