Create 函数在 Postgres 中给出语法错误

问题描述 投票:0回答:1

我对 PostgreSQL 和 Node-RED 都很陌生。

看起来你可以在 PostgreSQL 中创建具有动态名称的表。类似于 thisthis:

-- gives error: syntax error at »LANGUAGE«
CREATE OR REPLACE FUNCTION table_per_meter(meter_secondary text)
RETURNS INTEGER AS
LANGUAGE plpgsql
$body$
BEGIN
  RETURN QUERY 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) 
END;
$body$

我无法发现这里的错误。

使用
RETURN QUERY EXECUTE
是错误还是开销?

这些示例看起来简单得多:

EXECUTE format('SELECT count(*) FROM %I '
   'WHERE inserted_by = $1 AND inserted <= $2', tabname)
   INTO c
   USING checked_user, checked_date;

但是我的问题似乎与函数定义的方式有关。

postgresql
1个回答
0
投票

小错误:

RETURN
语句末尾缺少一个分号。

但是函数代码存在一个更深层次的问题:如果您提供一个字符串作为函数参数,而该字符串不是 SQL 标准标识符,则会在错误的位置得到双引号。例如,对于参数

CamelCase
,表名称将变为
meter_value_"CamelCase"
,这是不正确的。

像这样进行:

format(
   'CREATE TABLE IF NOT EXISTS %I(...)',
   'meter_value_' || meter_secondary
)
© www.soinside.com 2019 - 2024. All rights reserved.