使用Array_append在创建PostgreSQL函数时出现语法错误

15

以下是代码

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

我是一个PostgreSQL函数的新手。我不明白为什么我无法使这个数组正常工作。

我只想正确地填充这个数组,使其包含'current'数组计数。这主要是为了帮助我理解循环是否正确执行并正确计数。

谢谢你的帮助。


你为什么要使用数据库来生成质数?!? - Chris S
我猜你只是为了学习PL/SQL才这样做 - 我认为在SO上问这个问题会更合适。 - MikeyB
是的,我只是为了学习而这样做。 - StanM
1个回答

28
详细手册中得知: 函数: 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 中连续整数的序列。


太棒了。谢谢,那就是我的问题。是的,我正在寻找array_length - 我正在尝试学习SQL编程语法。这是一个全新的世界。 - StanM
@StanQA:你可能想看一下generate_series来生成序列。你需要考虑集合/表而不是循环,但这也是你必须处理 SQL 的方式。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接