2013-08-28 76 views
1

如何在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 
+1

所以你要動態地創建陣列,陣列上環?從你的例子來看,並不清楚(對我來說)。你可以使用'array_append'來添加數組中的元素,如果這是你需要的 - http://www.postgresql.org/docs/current/static/functions-array.html –

回答

3

沒有用於此目的的特殊功能 - array_fill:

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

postgres=# select array_fill('Hello'::text, ARRAY[10]); 
          array_fill       
--------------------------------------------------------------- 
{Hello,Hello,Hello,Hello,Hello,Hello,Hello,Hello,Hello,Hello} 
(1 row) 

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

在PL/pgSQL的(但對於大型陣列顯著慢(超過100個項目):

 
DO $$ 
DECLARE 
result int[] = '{}'; 
BEGIN 
    FOR i IN 1..10 
    LOOP 
    result := result || 0; 
    END LOOP; 
    RAISE NOTICE '%', result; 
END; 
$$; 
+0

我不想將值存儲到數組中。我想創建數組爲arr1 [],arr2 [],arr3 [],arr4 [] n次。 – user2659199

+0

對不起,我不明白。你爲什麼這樣做?你是做什麼? –

+0

使用for循環我必須創建數組。如果for循環執行4次,那麼我需要創建4個數組作爲arr1,arr2,arr3,arr4。 – user2659199

0

很難說你不知道最終目標應該走哪條路Pave l 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