Поддерживает ли Greenplum динамический SQL?
-
29-09-2020 - |
Вопрос
PostgreSQL реализует execute ... using
возможность передавать параметры в динамический SQL, и, насколько я могу судить, эта функция была введена в версии 8.4.Мы используем Greenplum, который является ответвлением PostgreSQL версии 8.2, поэтому у него нет этой функции.
Есть ли другой способ сделать то же самое в Greenplum или PostgreSQL 8.2?
Решение
Не могу сказать наверняка, но намек есть. CREATE FUNCTION
документация:
langName название языка, в котором функция реализована.Это может быть SQL, C, внутренний или имя определяемого пользователем процедурного языка.См. CREATE LANGUAGE, чтобы узнать о процедурных языках, поддерживаемых в базе данных Greenplum.
В свою очередь, в указанном месте говорится
Язык PL/pgSQL установлен в базе данных Greenplum по умолчанию.
Сейчас EXECUTE ... USING
— это функция PL/pgSQL, поэтому единственный вопрос — из какой версии PostgreSQL она взята.В документации указана версия 8.2 - и похоже, что вам не повезло.
Я связался со службой поддержки Greenplum, чтобы получить окончательный ответ, но так и не получил ответа.
Что касается отсутствия этой конструкции, вы, очевидно, можете объединить любую строку SQL и выполнить ее.Будьте внимательны и правильно заключайте в кавычки передаваемые значения и избегайте SQL-инъекций.
Другие советы
Вы можете использовать обходной путь с помощью сохраненной функции, упомянутой DEZSO:
CREATE OR REPLACE FUNCTION dynamic_query (table_name TEXT) RETURNS VOID AS $$
BEGIN
EXECUTE 'SELECT * FROM ' || table_name || ' WHERE column1 LIKE ''a_value''';
END;
$$ language plpgsql;
.