如何循环删除

时间:2017-08-23 07:59:19

标签: sql firebird sql-delete firebird2.5

我想知道是否以及如何循环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 - 循环和光标一起使用吗? 这种方法怎么样? 我还没有使用游标。

2 个答案:

答案 0 :(得分:2)

你不能。

  

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

完全。

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

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

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

您链接的文档声称

  

<强> RETURNING

     

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

重点来自文档本身。

答案 1 :(得分:1)

你可以这样做:

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