2

PostgreSQL内で動的に配列を作成する方法は?

これを考慮してください。

CREATE OR REPLACE FUNCTION fun( )
RETURNS SETOF void AS
$BODY$
DECLARE

i numeric;

BEGIN

 FOR i in 1..10   LOOP
     //I have to create an array as 
     arr1[] ,arr2[] ... based on length
 END LOOP;
END;

$BODY$
LANGUAGE plpgsql
4

2 に答える 2

7

この目的のための特別な関数があります - array_fill:

postgres=# select array_fill(0, ARRAY[10]);
      array_fill       
-----------------------
 {0,0,0,0,0,0,0,0,0,0}
(1行)

postgres=# select array_fill('Hello'::text, ARRAY[10]);
                          array_fill                           
-------------------------------------------------- -------------
 {こんにちは、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは}
(1行)

postgres=# select array_fill(0, ARRAY[3,3]);
        array_fill         
---------------------------
 {{0,0,0},{0,0,0},{0,0,0}}
(1行)

PL/pgSQL の場合 (ただし、大きな配列 (100 項目以上) の場合は大幅に遅くなります):

やる $$
宣言する
結果 int[] = '{}';
始める
  FOR i IN 1..10
  ループ
    結果 := 結果 || 0;
  エンドループ;
  RAISE NOTICE '%'、結果。
終わり;
$$;
于 2013-08-28T12:10:57.420 に答える
1

最終的な目標を知らずにどちらに進むべきかを言うのは本当に難しいです。Pavel Stehule は、配列を埋めることについて良いアドバイスをくれました。一時テーブルを使用して、関数内に配列を格納できます。
次のように、一連の配列を返し、それを反復処理する関数を作成することもできます。

create or replace function fun1()
returns setof int[] as
$BODY$
declare
    i int;
begin
    for i in 1..10 loop
        return next array_fill(0, array[i]);
    end loop;
end;
$BODY$
language plpgsql;


create or replace function fun2()
returns setof int as
$BODY$
declare
    a int[];
begin
    for a in select * from fun1() loop
        return next array_length(a, 1);
    end loop;
end;
$BODY$
language plpgsql;

sql fiddle frmo

于 2013-08-29T08:52:29.420 に答える