2017-08-23 43 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 –