2013-03-13 33 views
1

我想在循環時在表格中插入一些記錄。記錄是作爲一個varchar選項卡的功能,即:通過INSERT while LOOPing

create function a(tab varchar[]) RETURNS void AS 
$$ 
DECLARE 
    b varchar(20); 
BEGIN 
    FOREACH b IN ARRAY tab 
    LOOP 
     INSERT INTO....; 
    END LOOP; 
    RETURN; 
END; 
$$ 
LANGUAGE plpgsql; 

但是,在執行有錯誤時:

ERROR: syntax error at or near "FOREACH" 
LINE 1: FOREACH $1 IN ARRAY tab LOOP INSERT INTO x (c, ... 
QUERY: FOREACH $1 IN ARRAY tab LOOP INSERT INTO x (c) VALUES ($1) 
CONTEXT: SQL statement in PL/PgSQL function " near line ... 

********** ERROR ********** 

ERROR: syntax error at or near "FOREACH" 

有誰知道爲什麼和如何解決這一問題?

+0

哪個版本的Postgres?似乎已經在9.1中添加了「陣列中的FOREACH」。 – NPE 2013-03-13 11:15:53

+0

**始終**提供您正在使用的版本號。這是一個程序員的網站,你應該知道*做到這一點。另外,如果你提供了一個完整的例子,很可能你不需要循環,而且這種方式會更快。 – 2013-03-13 16:41:37

回答

1

FOREACH構建體在9.1中添加。對於早期版本,您可以使用unnest()功能方式如下:

CREATE FUNCTION a(tab varchar[]) RETURNS void AS 
$$ 
DECLARE 
    b varchar(20); 
BEGIN 
    FOR b IN SELECT unnest(tab) 
    LOOP 
    INSERT INTO x(c) VALUES (b); 
    END LOOP; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 
0

我想補充一點,那就是UNNEST unnests各級數組:

select * from unnest(ARRAY[ARRAY[1,2,3],Array[5,6,7]]); 
unnest 
-------- 
     1 
     2 
     3 
     5 
     6 
     7 
(6 rows) 

如果你想循環通過多維陣列的一個電平,則應該通過替代以下

FOR out_count IN 
        array_lower(in_transactions, 1) .. 
        array_upper(in_transactions, 1) 
    LOOP 
     -- Fill the bulk payments table 
     INSERT INTO bulk_payments_in(id, amount) 
     VALUES (in_transactions[out_count][1], 
       in_transactions[out_count][2]); 
    END LOOP; 
+0

PostgreSQL 9.1+有一個專門的功能。 – 2013-03-15 01:57:59

3

環路因爲PostgreSQL 9.1還有一個built-in way to loop through array slices

FOREACH x SLICE 1 IN ARRAY $1 
LOOP 
    RAISE NOTICE 'row = %', x; 
END LOOP; 

x必須是匹配陣列類型和...

The SLICE value must be an integer constant not larger than the number of dimensions of the array

對於一維數組只是省略了SLICE部分和x可以是一個簡單的類型像你顯示你的題。