我正在尝试在postgres函数中使用EXECUTE format(...)USING(param1,param2,...)功能。相关代码段如下
EXECUTE format('select json_agg(json_build_object(''Attribute'', x.attr, ''Aggregate'',x.agg))
from
( select %I as attr, round(sum(value),6) as agg
from schema_name.seperate_function($1,$2)
group by attr
order by agg desc ) x', columnNames[1])
USING (param1, param2)
哪里
columnNames[1], param1, & param2
先前在函数中定义。实际上,param1和param2被输入到函数中,并在函数主体的开头声明。
DECLARE
param1 ALIAS FOR $1;
param2 ALIAS FOR $2;
自然,我实际上没有实际调用参数的param1或2,schema_name.seperate_function也不是这段代码所引用的实际函数名。无论如何,执行此命令时,都会出现以下错误:
ERROR: there is no parameter $2
LINE 4: ... from schema_name.seperate_function($1,$2)
如果相反,如果我将格式化查询字符串中的$ 2替换为硬编码值,并从USING子句中删除了param2,它将正常工作。最初,我认为这与语法有关,但是在查看了The accepted answer here
之后例如,我的语法没有任何问题。谢谢您的任何建议。
答案 0 :(得分:2)
您正在将行 let columnDataConv = data.operatorStats.reduce(function(map, obj){
let newObj = [];
let cData = Object.keys(data.daily_operator_trend).reduce(function(m, o){
m['name'] = '';
m['data'] = [];
for (let [key, value] of Object.entries(data.daily_operator_trend[o])){
if (key == obj.details.operatorId){
if ( obj.details.nickname in m){
m['data'].push(value);
}else {
m['name']= obj.details.nickname;
m['data'].push(value);
}
}else {
m['data'].push(0);
}
newObj.push(m);
}
return newObj;
}, {})
map={...cData};
return map;
}, {});
作为第一个参数传递,然后没有第二个参数。如果将(param1, param2)
替换为硬编码值并保留$2
,则会看到它正在将行传递到(param1, param2)
而不是$1
。
您需要做的是:param1
没有括号。