Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何循环删除_Sql_Firebird_Sql Delete_Firebird2.5 - Fatal编程技术网

Sql 如何循环删除

Sql 如何循环删除,sql,firebird,sql-delete,firebird2.5,Sql,Firebird,Sql Delete,Firebird2.5,我想知道是否以及如何循环delete语句的结果 delete语句可以返回已删除记录的值: 返回以下错误消息: 无效令牌。 动态SQL错误。 SQL错误代码=-104。 令牌未知-第7行第5列。 删除 那么,这有可能吗 它是否可以与选择的环境一起工作。。。你要循环和光标吗? 这种方法会是什么样子? 我还没有使用过游标。你不能 但是使用返回语法,一个包含多个结果记录的delete会给我: 单件选择中有多行 没错 INSERT/UPDATE/DELETE/UPDATE-OR-INSERT在使用RETU

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

delete语句可以返回已删除记录的值:

返回以下错误消息:

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

那么,这有可能吗

它是否可以与选择的环境一起工作。。。你要循环和光标吗? 这种方法会是什么样子? 我还没有使用过游标。

你不能

但是使用返回语法,一个包含多个结果记录的delete会给我: 单件选择中有多行

没错

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

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

而且,您不能在完全不包含行的集合上循环

您链接的文档声称

返回

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


重点来自文档本身。

您可以这样做:

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变量执行带有WHERE CURSOR CURRENT OF子句的内部DELETE,但在Firebird 3中,游标通常非常慢。@Arioch'The不知道这一点!感谢您指出这一点。打开www.translate.ru并浏览,两个指向使用游标示例的链接位于-但是在FB3中游标可能非常慢,他们仍然在3.01、3.02等中发现性能缺陷。。。。
EXECUTE BLOCK
RETURNS (
  ADSREF TYPE OF DMN_REFID)
AS
begin
  for
    delete from m_s_ad_memo
      returning ADSREF into :adsref
  do
    suspend;
end
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