использование Array_append вызывает синтаксическую ошибку при создании функции PostgreSQL - PullRequest
8 голосов
/ 13 марта 2012

Вот код

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.Я не понимаю, почему я не могу заставить этот массив работать должным образом.

Опять же, все, что я хочу, это просто правильно заполнить этот массив с помощью "текущего" счетчика массива.(Это больше, чтобы просто помочь мне понять, что он действительно делает цикл правильно и считает его правильно).

Спасибо за вашу помощь.

1 Ответ

16 голосов
/ 13 марта 2012

Из подробного руководства :

Функция : array_append(anyarray, anyelement)
Тип возврата : anyarray
Описание : добавить элемент в конец массива

Итак, array_append возвращает массив, и вам необходимо присвоить это возвращаемое значение чему-либо.Кроме того, я думаю, вы хотите 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...