在PostgreSQL中创建函数

bsxbgnwa  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(97)

我不确定CREATE FUNCTION语句在PostgreSQL中是如何工作的。我想定义一个函数(只是为了娱乐),这样给定一个数字n,它打印从1到n的所有值,所以我写了这个:

CREATE FUNCTION asterisks(n int)
RETURNS CHAR AS
BEGIN
for i in range(1,n+1):
   print("*"*i + "\n")
END
LANGUAGE python

字符串
我想要的n=3的结果:

*
**
***


然而,我不确定这样调用Python是否可行。我在这里读到Postgres支持Python作为过程语言:
https://www.postgresql.org/docs/current/xplang.html

92vpleto

92vpleto1#

Postgres 14或更高版本

最简单的方法是使用新的标准SQL语法:

CREATE OR REPLACE FUNCTION asterisks(n int)
  RETURNS SETOF text
RETURN repeat('*', generate_series (1, n));

字符串
或者更好(和所有标准SQL):

CREATE OR REPLACE FUNCTION asterisks(n int)
  RETURNS SETOF text
  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
BEGIN ATOMIC
SELECT repeat('*', g) FROM generate_series (1, n) g;
END;


“更好”是因为它更容易理解,坚持标准SQL(更可移植)。两者都有争议。它适当地设置了IMMUTABLE STRICT PARALLEL SAFE,否则默认为VOLATILE CALLED ON NULL INPUT PARALLEL UNSAFE。无争议。
电话:

SELECT asterisks(6);


或者,更明确地说,符合标准:

SELECT * FROM asterisks(6);


参见:

Postgres 13(或任何版本):

SQL函数:

CREATE OR REPLACE FUNCTION asterisks(n int)
  RETURNS SETOF text
  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
SELECT repeat('*', generate_series (1, n));
$func$;


带循环的PL/pgSQL函数(循环通常更昂贵):

CREATE OR REPLACE FUNCTION pg_temp.asterisks(n int)
  RETURNS SETOF text
  LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
BEGIN
FOR i IN 1..n LOOP
   RETURN NEXT repeat('*', i);
END LOOP;
END
$func$;


参见:

  • PostgreSQL函数中sql语言和plpgsql语言的区别

当然,对于简单的例子,我只运行普通语句而不是创建函数:

SELECT repeat('*', generate_series (1, 3));

ig9co6j1

ig9co6j12#

您可以使用PL/pgSQL或SQL语言创建函数。

例如,创建test表,如下所示:

CREATE TABLE test (
  num INTEGER
);

字符串
然后,插入num2的行,如下所示:

INSERT INTO test (num) VALUES (2);


现在,您可以创建my_func() PL/pgSQL函数,该函数将value添加到num并将value返回给调用者,如下所示:

CREATE FUNCTION my_func(value INTEGER) RETURNS INTEGER
AS $$
BEGIN
  UPDATE test set num = num + value;
  SELECT num INTO value FROM test;
  RETURN value;
END;
$$ LANGUAGE plpgsql;


或者,您可以创建my_func() SQL函数,将value添加到num并将value返回给调用者,如下所示:

CREATE FUNCTION my_func(value INTEGER) RETURNS INTEGER
AS $$
UPDATE test SET num = num + value;
SELECT num FROM test;
$$ LANGUAGE SQL;


然后,您可以使用SELECT statement调用my_func(3),然后返回5,并将3添加到num,如下所示:

postgres=# SELECT my_func(3);
 my_func
---------
       5
(1 row)

postgres=# SELECT num FROM test;
 num
-----
   5
(1 row)

相关问题