创建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;

"Better"因为它更容易理解,所以坚持使用标准SQL(更可移植)。这两个有争议的。它集IMMUTABLE STRICT PARALLEL SAFE适当,否则默认VOLATILE CALLED ON NULL INPUT PARALLEL UNSAFE。无可争议了。

调用:

SELECT asterisks(6);

或者,更明确和符合标准:

SELECT * FROM asterisks(6);

:

  • generate_series()in Postgres manual
  • 使用数据类型"text"用于存储字符串?
  • 什么是BEGIN ATOMIC…END在PostgreSQL SQL函数/过程中意味着什么?

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

相关内容

  • 没有找到相关文章