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