2017-08-23 58 views
1

我想知道是否以及如何遍历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一起使用 - 环形和光标?
这种方法将如何?
我还没有使用光标,但。

+1

两个链接的“使用游标”是在https://stackoverflow.com/a/45373980/976391例子 - 但是游标可以在很慢FB3,他们仍然在3.01,3.02,... –

回答

2

你不能。

但是,使用返回语法,具有多个结果记录的删除操作会提供给我: singleton select中的多行。

没错。

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

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

而且你不能“循环”不包含任何行的集合。


通过你的链接的文档称,

RETURNING

一个DELETE语句中最多一行除去可任选包括,以从返回值的返回条款删除行。

强调来自文档本身。

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 
+1

找到他们的性能错误,没有':ID'变量执行内部'DELETE'与“WHERE CURRENT OF * CURSOR *”子句,但在Firebird 3游标往往非常缓慢。 –

+0

@Arioch'The不知道这个!感谢您指出这一点。 – skafinski

+0

打开www.translate.ru并扫描http://www.sql.ru/forum/1269227和http://www.sql.ru/forum/1233785 –