为什么postgres不接受函数参数作为表名

时间:2011-04-26 09:18:36

标签: function postgresql plpgsql

我正在尝试使用以下函数更新表格。表名是函数参数。运行此函数会导致错误:

ERROR: syntax error at or near "$1" LINE 1: (SELECT * FROM $1 ORDER BY $2 )

我尝试使用EXECUTE语句和quote_ident函数,但没有成功。我确定我忽视了一些简单的事情......

CREATE OR REPLACE FUNCTION createdefaultorder(table_name varchar, sort_column varchar)
  RETURNS integer AS
$BODY$
DECLARE
  rRec RECORD;
  counter integer := 0;
BEGIN
  FOR rRec IN  (SELECT * FROM table_name ORDER BY sort_column)  LOOP
    UPDATE table_name SET row_number = counter WHERE id = rRec.id;
    counter := counter + 1;
  END LOOP; 
  RETURN 0;
END;
$BODY$
  LANGUAGE plpgsql;

3 个答案:

答案 0 :(得分:5)

使用EXECUTEquote_ident是正确的解决方案。如果您遇到问题,可能需要显示该代码。

答案 1 :(得分:0)

Executequote_ident是该问题的解决方案:PostgreSQL 8.4 Manual

答案 2 :(得分:0)

您必须在动态查询执行中使用EXECUTE和quote_ident(),如下所示:

BEGIN FOR rRec IN EXECUTE 'SELECT * FROM ' || quote_ident(table_name) || ' ORDER BY ' || quote_ident(sort_column) LOOP EXECUTE 'UPDATE ' || quote_ident(table_name) || ' SET row_number = ' || counter || ' WHERE id = ' || rRec.id; counter := counter + 1; END LOOP; RETURN 0; END;