【问题标题】:How to loop over delete如何循环删除
【发布时间】:2017-08-23 07:59:19
【问题描述】:

我想知道是否以及如何循环遍历 delete 语句的结果。

delete 语句能够返回已删除记录的值:

Firebird 2.5 Language Reference

DELETE
  FROM {target} [[AS] alias]
  [WHERE {search-conditions | CURRENT OF cursorname}]
  [PLAN plan_items]
  [ORDER BY sort_items]
  [ROWS <m> [TO <n>]]
  [RETURNING <returning_list> [INTO <variables>]]

<m>, <n>         ::=  Any expression evaluating to an integer.
<returning_list> ::=  ret_value [, ret_value ...]
<variables>      ::=  :varname [, :varname ...]

但是使用returning 语法,带有多个结果记录的delete 给了我:

单例选择中的多行。

这样的块语句

EXECUTE BLOCK
RETURNS (
  ADSREF TYPE OF DMN_REFID)
AS
begin
  for
    delete from m_s_ad_memo
      returning ADSREF into :adsref
  do
    suspend;
end

返回以下错误信息:

令牌无效。
动态 SQL 错误。
SQL 错误代码 = -104。
令牌未知 - 第 7 行,第 5 列。
删除。

那么,这可能吗?

它可以与周围的for select ... do-loop 和光标一起使用吗?
这种方法会是什么样子?
我还没有使用过游标。

【问题讨论】:

  • 两个指向“使用游标”示例的链接位于stackoverflow.com/a/45373980/976391 - 但是游标在 FB3 中可能非常慢,他们仍然在 3.01、3.02、...中发现性能错误。

标签: sql firebird sql-delete firebird2.5


【解决方案1】:

你不能。

但是使用返回语法,具有多个结果记录的删除会给我: 单例选择中的多行。

没错。

使用 RETURNING 子句执行时,INSERT/UPDATE/DELETE/UPDATE-OR-INSERT 被视为存储过程调用类语句,而不是查询类语句。

这意味着它们不会返回许多不同行的“结果集”,而是返回一组标量参数/字段。

而且你不能“循环”在根本不包含行的集合上。


您链接的文档声称

回归

删除最多一行DELETE 语句可以选择包含一个 RETURNING 子句,以便从已删除的行中返回值。

重点来自文档本身。

【讨论】:

    【解决方案2】:

    你可以这样做:

    CREATE OR ALTER PROCEDURE NEW_PROCEDURE
    RETURNS (
        OUT VARCHAR(10))
    AS
    DECLARE VARIABLE ID INTEGER;
    DECLARE VARIABLE TEXT VARCHAR(10);
    BEGIN
      FOR SELECT xxx.id
      FROM xxx
      WHERE xxx.id < 5 --some condition
      INTO :ID DO
      BEGIN
        DELETE FROM xxx
        WHERE xxx.id = :ID
        RETURNING xxx.name INTO :TEXT;    /*this is optional (you could select this 
                                            text in up select statement*/
    
        OUT = :ID || ' ' || :TEXT;
    
        SUSPEND;
      END
    END
    

    【讨论】:

    • 也可以不用:ID 变量执行内部DELETE 并使用“WHERE CURRENT OF CURSOR”子句,但在 Firebird 3 中游标通常非常慢。跨度>
    • @Arioch'The 不知道这个!感谢您指出这一点。
    • 打开 www.translate.ru 并浏览 sql.ru/forum/1269227sql.ru/forum/1233785
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2016-11-29
    • 1970-01-01
    • 2013-04-08
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多