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