我正在努力使用大量使用动态查询的存储过程。其中我需要将现有列的最大值存储到变量中。 Postgres文档说明"如果要使用动态确定的表或列名,则必须以文本方式将它们插入命令字符串"。基于此,我提出了以下声明:
EXECUTE 'SELECT MAX(' || pkColumn::regclass || ') FROM ' ||
tableName::regclass INTO maxValue;
表名似乎没问题,列名触发错误。
我做错了什么? 帕维尔
答案 0 :(得分:0)
EXECUTE 'SELECT MAX(' || pkColumn ||'::regclass) FROM ' || ...
::regclass
是在查询中完成的强制转换。您也可以跳过它,或者将“ - 在PG中的工作方式相同。所以请尝试以下方法之一:
EXECUTE 'SELECT MAX(' || pkColumn || ') FROM ' || ...
或
EXECUTE 'SELECT MAX("' || pkColumn || '") FROM ' || ...
所有树都应该工作。如果没有 - 请告诉我。在那种情况下,这是我的错,postgresql只是有效。
答案 1 :(得分:0)
没有理由转换参数,因为它们只是标识符。为了更好地控制和可读性,请使用函数format(),
,例如:
declare
pkcolumn text = 'my_column';
tablename text = 'my_table';
...
execute format('select max(%I) from %I', pkcolumn, tablename)
into maxvalue;