使用EXECUTE format(...)时使用参数$ 2(param1,param2)

时间:2018-08-29 13:24:42

标签: postgresql execute using-statement

我正在尝试在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

之后

例如,我的语法没有任何问题。谢谢您的任何建议。

1 个答案:

答案 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没有括号。