Почему postgres не принимает аргумент функции в качестве имени таблицы - PullRequest
0 голосов
/ 26 апреля 2011

Я пытаюсь обновить таблицу, используя функцию ниже.Имя таблицы является аргументом функции.Запуск этой функции приводит к ошибке:

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 ]

5 голосов
/ 26 апреля 2011

Использование EXECUTE и quote_ident - правильное решение.Если у вас есть проблемы с этим, вы можете показать этот код.

0 голосов
/ 21 июля 2015

Вы должны использовать 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;
0 голосов
/ 28 апреля 2011

Execute и quote_ident - решение этой проблемы: Руководство по PostgreSQL 8.4

...