我有一个函数用作插入触发器.此函数用于删除与插入行的[序列号]冲突的行.它运行得很好,所以我真的不想讨论这个概念的优点.

DECLARE
re1 feeds_item.shareurl%TYPE;
BEGIN
SELECT regexp_replace(NEW.shareurl, '/[^/]+(-[0-9]+\.html)$','/[^/]+\\1') INTO re1;
RAISE NOTICE 'DELETEing rows from feeds_item where shareurl ~ ''%''', re1;

DELETE FROM feeds_item where shareurl ~ re1;
RETURN NEW;
END;

我想在通知中添加一个指示,说明有多少行受到影响(aka:deleted).我该怎么做(使用"plpgsql"语言)?

UPDATE:

DECLARE
re1 feeds_item.shareurl%TYPE;
num_rows int;
BEGIN
SELECT regexp_replace(NEW.shareurl, '/[^/]+(-[0-9]+\.html)$','/[^/]+\\1') INTO re1;

DELETE FROM feeds_item where shareurl ~ re1;
IF FOUND THEN
    GET DIAGNOSTICS num_rows = ROW_COUNT;
    RAISE NOTICE 'DELETEd % row(s) from feeds_item where shareurl ~ ''%''', num_rows, re1;
END IF;
RETURN NEW;
END;

推荐答案

在Oracle PL/SQL中,存储已删除/插入/更新行数的系统变量为:

SQL%ROWCOUNT

在执行DELETE/INSERT/UPDATE语句之后,在提交之前,可以将SQL%ROWCOUNT存储在NUMBER类型的变量中.请记住,提交或回滚会将SQL%ROWCOUNT的值重置为零,因此在提交或回滚之前,必须在变量中复制SQL%ROWCOUNT的值.

例子:

BEGIN
   DECLARE
      affected_rows   NUMBER DEFAULT 0;
   BEGIN
      DELETE FROM feeds_item
            WHERE shareurl = re1;

      affected_rows := SQL%ROWCOUNT;
      DBMS_OUTPUT.
       put_line (
            'This DELETE would affect '
         || affected_rows
         || ' records in FEEDS_ITEM table.');
      ROLLBACK;
   END;
END;

我也发现了这个有趣的解决方案(来源:http://markmail.org/message/grqap2pncqd6w3sp)

2007年4月7日,Karthikeyan Sundaram写道:

你好

I am using 8.1.0 postgres and trying to write a plpgsql block.  In that I am inserting a row.  I want to check to see if the row has been

插入或不插入.

在甲骨文中,我们可以这样说

begin
  insert into table_a values (1);
  if sql%rowcount > 0
  then
    dbms.output.put_line('rows inserted');
  else
    dbms.output.put_line('rows not inserted');
 end if;  end;

在博士后中是否有与sql%rowcount相等的东西?请帮忙.

问候斯卡蒂

也许 吧:

http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW

点击上面的链接,您将看到以下内容:

37.6.6. 获取结果状态有几种方法可以确定命令的效果.第一种方法是使用GET

获取诊断变量=项[,…];此命令允许

举个例子:

获取诊断整型变量=行计数;第二种方法

如果指定了行,SELECT INTO语句会设置FOUND true,如果指定了行,则设置false

如果执行语句生成(并丢弃)一个

UPDATE、INSERT和DELETE语句集在至少一个

FETCH语句如果返回一行,则将FOUND设置为true,如果没有行,则将设置为false

如果FOR语句重复一次或多次,则会发现它为true,否则

FOUND是每个PL/pgSQL函数中的一个局部变量;有什么变化吗

Postgresql相关问答推荐

无法从Docker迁移Golang上的两个不同服务到一个数据库'

此PostgreSQL汇总分组不适用于窗口表达式

Gorm 中的更新将created_at、updated_at 作为默认时间

PostgreSQL 不删除旧的 WAL 档案

具有有限字母表的自定义字符串类型

如何在 postgres 中查询键设置为空值的 jsonb 字段

postgres vacuum 是否改进了我的查询计划

带有附加组的时间刻度 interpolated_average

无法从外部连接到在 AWS EC2 实例上运行的 Postgres

PostgreSQL 中的复制槽是否会阻止删除 WALL,即使它们来自另一个数据库?

是否可以使用 pgAdmin4 自动格式化/美化 SQL 查询?

PostgreSQL - jsonb_each

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

Postgres 中的相似函数与 pg_trgm

datagrip 无法应用更改 此表是只读的

如何将参数值添加到 pgadmin sql 查询?

Redis 可以写出到像 PostgreSQL 这样的数据库吗?

Hibernate 启动很慢

是否可以在 CSV 格式的 Postgres COPY 命令中关闭报价处理?

如何在 postgresql 中获取整个表的哈希?