在 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 作为过程语言:
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);
参见:
generate_series()
in the Postgres manual
- Any downsides of using data type "text" for storing strings?
- What does BEGIN ATOMIC ... END mean in a PostgreSQL SQL function / procedure?
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));
我不确定 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 作为过程语言:
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);
参见:
generate_series()
in the Postgres manual- Any downsides of using data type "text" for storing strings?
- What does BEGIN ATOMIC ... END mean in a PostgreSQL SQL function / procedure?
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));