我对 PostgreSQL 和 Node-RED 都很陌生。
看起来你可以在 PostgreSQL 中创建具有动态名称的表。类似于 this 或 this:
-- 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;
但是我的问题似乎与函数定义的方式有关。
小错误:
RETURN
语句末尾缺少一个分号。
但是函数代码存在一个更深层次的问题:如果您提供一个字符串作为函数参数,而该字符串不是 SQL 标准标识符,则会在错误的位置得到双引号。例如,对于参数
CamelCase
,表名称将变为 meter_value_"CamelCase"
,这是不正确的。
像这样进行:
format(
'CREATE TABLE IF NOT EXISTS %I(...)',
'meter_value_' || meter_secondary
)