在 PostgreSQL 中创建函数

Create function in PostgreSQL

我不确定 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

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$;

参见:

  • Difference between language sql and language plpgsql in PostgreSQL functions

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

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