2012-03-13 162 views
8

在這裏給我語法錯誤是代碼使用Array_append創建PostgreSQL的功能

CREATE OR REPLACE FUNCTION primes (IN integer) RETURNS TEXT AS $$ 
DECLARE 
    counter INTEGER = $1; 
    primes int []; 
    mycount int; 
    BEGIN 
    WHILE counter != 0 LOOP 
     mycount := count(primes); 
     array_append(primes [counter], mycount); 
     counter := counter - 1; 
    END LOOP; 
    RETURN array_to_text(primes[], ','); 
    END; 
$$ 
LANGUAGE 'plpgsql' 

這是我開發的首要生成函數的開端。我試圖簡單地讓它返回數組的'數'。所以如果我將'7'傳遞給函數,我應該返回[0,1,2,3,4,5,6]。

但是當我嘗試創建這個功能我得到

SQL Error: ERROR: syntax error at or near "array_append" LINE 1: array_append($1 [ $2 ], $3) 
     ^QUERY: array_append($1 [ $2 ], $3) CONTEXT: SQL statement in PL/PgSQL function "primes" near line 8 

我與Postgres的功能的新手。我不明白爲什麼我不能讓這個數組正常工作。

再次,我只需要將該陣列正確填入陣列的「當前」計數。 (這更多的是幫助我理解它實際上是在正確地執行循環並正確計算它)。

謝謝你的幫助。

+0

你爲什麼使用數據庫來生成Primes?!? – 2012-03-13 00:55:29

+0

我認爲你只是在學習PL/SQL,我認爲這對於這個問題來說是一個更合適的地方。 – MikeyB 2012-03-13 01:09:11

+0

是的,我只是在做這個來學習。 – StanM 2012-03-13 13:44:11

回答

13

fine manual

功能array_append(anyarray, anyelement)
返回類型anyarray
說明:元件附加到陣列的端

所以array_append返回一個ar並且你需要把這個返回值賦值給某個東西。另外,我認爲你需要array_to_string在你的函數結束,而不是array_to_text。而primes是一個數組,因此您想要array_append(primes, mycount)而不是嘗試附加到primes中的條目。

CREATE OR REPLACE FUNCTION primes (IN integer) RETURNS TEXT AS $$ 
DECLARE 
    counter INTEGER = $1; 
    primes int []; 
    mycount int; 
BEGIN 
    WHILE counter != 0 LOOP 
     mycount := count(primes); 
     primes := array_append(primes, mycount); 
     counter := counter - 1; 
    END LOOP; 
    RETURN array_to_string(primes, ','); 
END; 
$$ LANGUAGE 'plpgsql'; 

我不知道你打算mycount := count(primes);做的,也許你的意思是說mycount := array_length(primes, 1);,這樣你會在primes獲得連續整數的序列。

+0

太棒了。謝謝你,那是我的問題。是的,我正在尋找array_length - 我正在嘗試學習SQL編程語法。這是一個全新的世界。 – StanM 2012-03-13 17:26:43

+0

@StanQA:您可能需要查看['generate_series'](http://www.postgresql.org/docs/current/static/functions-srf.html#FUNCTIONS-SRF-SERIES)以生成序列。你必須考慮set/tables而不是循環,但這就是你必須用SQL處理SQL的方法。 – 2012-03-13 17:29:00