如何在PostgreSQL中用CREATE FUNCTION编写打印星号的Python自定义函数
你的写法不可行,存在以下几个问题:
- 语法不匹配:
BEGIN/END是PL/pgSQL的块语法标识,PL/Python的函数体不需要用这种结构包裹,直接写Python代码即可 - 返回类型定义错误:
CHAR类型只能存储单个字符,无法承载多行返回结果 - 输出逻辑错误:PL/Python中的
print语句会将内容输出到PostgreSQL服务端日志,不会作为函数的查询结果返回给客户端 - 语言标识错误:PostgreSQL的Python过程语言正确标识为
plpython3u(对应Python3)或plpythonu(对应Python2),不能直接写python
正确实现步骤
- 首先确保已经安装PL/Python3扩展:
CREATE EXTENSION IF NOT EXISTS plpython3u;
方案1:返回单个带换行的完整文本
如果希望一次返回拼接好所有换行的完整字符串,函数写法如下:
CREATE OR REPLACE FUNCTION asterisks(n int) RETURNS text AS $$ result = [] for i in range(1, n+1): result.append('*' * i) return '\n'.join(result) $$ LANGUAGE plpython3u;
调用方式:
SELECT asterisks(3);
输出结果就是你需要的带换行的星号序列。
方案2:每行作为单独的查询结果行返回
如果希望每行星号作为独立的行返回,函数写法如下:
CREATE OR REPLACE FUNCTION asterisks(n int) RETURNS SETOF text AS $$ for i in range(1, n+1): yield '*' * i $$ LANGUAGE plpython3u;
调用方式:
SELECT * FROM asterisks(3);
会返回3行结果,每行分别对应1到3个星号。
内容的提问来源于stack exchange,提问作者Mangostino
相关产品推荐
相关产品推荐

