代码之家  ›  专栏  ›  技术社区  ›  Tom

如何为单个游标获取10行

  •  0
  • Tom  · 技术社区  · 2 年前

    我有以下代码,我想从光标中提取10行,然后将它们保存在一个数组中,

    在这里,使用这段代码,我只想知道如何从一次提取中获得10行(或其他值)。

    CREATE OR REPLACE FUNCTION func_fetch_many(num INTEGER)
    returns integer as $$
    DECLARE
      my_cursor CURSOR FOR SELECT a,b,c FROM t_0038;
      my_array t_0038 ARRAY;
    BEGIN
      OPEN my_cursor;
      FETCH 10 FROM my_cursor INTO my_array; --ERROR here
      CLOSE my_cursor;
      foreach r in my_array
      loop
      raise notice 'r is %', r
      end loop;
      return 0;
        
    END;
    $$ LANGUAGE plpgsql;
    
    

    当我运行上面的代码时,它会抱怨 FETCH can't return multiple rows

    我想知道如何解决这个问题,谢谢。

    1 回复  |  直到 2 年前
        1
  •  1
  •   rakib3903    2 年前

    这个 FETCH PostgreSQL的PL/pgSQL语言中的语句被设计为一次获取一行,而不是多行。为了实现将多行提取到数组中的目标,您需要遍历光标并逐个提取行,然后将它们添加到循环中的数组中。 以下是如何修改代码以实现此目的:

    CREATE OR REPLACE FUNCTION func_fetch_many(num INTEGER)
    RETURNS integer AS $$
    DECLARE
      my_cursor CURSOR FOR SELECT a,b,c FROM t_0038;
      my_record t_0038%ROWTYPE;
      my_array t_0038[]; -- Declare an array of the same type as the cursor query
    BEGIN
      OPEN my_cursor;
      FOR i IN 1..num LOOP -- Loop to fetch 'num' rows
        FETCH NEXT FROM my_cursor INTO my_record;
        EXIT WHEN NOT FOUND; -- Exit the loop when no more rows are available
        my_array := my_array || my_record; -- Append the fetched row to the array
      END LOOP;
      CLOSE my_cursor;
      
      FOREACH r IN ARRAY my_array LOOP
        RAISE NOTICE 'a: %, b: %, c: %', r.a, r.b, r.c;
      END LOOP;
      
      RETURN 0;
    END;
    $$ LANGUAGE plpgsql;
    
    

    此版本初始化一个空数组my_array,然后将每个提取的行作为数组附加到其中。其余代码与前一版本类似,实现了从光标中提取和处理多行的相同目标。