PostgreSQL创建动态表函数报语法错误,求排查与优化建议
PostgreSQL函数语法错误及
RETURN QUERY EXECUTE使用问题解析 一、语法错误原因(syntax error at »LANGUAGE«)
你写的函数定义顺序不符合PostgreSQL规范:AS关键字后必须紧跟函数体的字符串分隔符($body$),LANGUAGE子句要放在函数体结束的分隔符之后。原代码把LANGUAGE plpgsql插在了AS和$body$之间,这是直接触发语法错误的原因。
二、RETURN QUERY EXECUTE的问题
这个用法完全错误,核心问题有两点:
RETURN QUERY是用来返回SELECT查询的结果集的,但你执行的是CREATE TABLE这类DDL语句,根本没有结果集可以返回;- 函数定义返回类型是
INTEGER,但RETURN QUERY会返回行集,两者类型完全不匹配。
执行DDL语句直接用EXECUTE即可,不需要RETURN QUERY。如果需要返回执行状态,可以手动返回一个整数(比如用1表示执行成功)。
三、修正后的函数代码
CREATE OR REPLACE FUNCTION table_per_meter(meter_secondary text) RETURNS INTEGER AS $body$ BEGIN -- 执行动态DDL创建表 EXECUTE format('CREATE TABLE IF NOT EXISTS meter_value_%I( id SERIAL PRIMARY KEY, v NUMERIC(21, 2) NOT NULL, d TIMESTAMP WITH TIME ZONE NOT NULL );', meter_secondary); -- 返回成功标识 RETURN 1; END; $body$ LANGUAGE plpgsql;
补充说明
对比官方示例,官方用EXECUTE ... INTO是因为要把查询结果存入变量,而你这里是执行DDL,不需要INTO子句,直接执行即可。另外,你用format函数的%I占位符处理表名,能有效防止SQL注入,这个用法是正确的。
内容的提问来源于stack exchange,提问作者BairDev
相关产品推荐
相关产品推荐

