Postgres запускает оператор SQL из строки

Я хотел бы выполнить оператор SQL на основе строки. Я создал оператор SQL с помощью функции, которая возвращает строку. Может ли кто-нибудь объяснить, как я могу выполнить возвращаемый оператор? Я знаю, что вы не можете сделать это в простом SQL, поэтому я подумал о том, чтобы поместить его в функцию. Единственная проблема заключается в том, что столбцы в операторе не всегда одинаковы, поэтому я не знаю, какие типы данных использовать для столбцов. Я использую Постгрес 9.1.0.

Например, предположим, что строка SQL, возвращаемая моей функцией, имеет вид:

Выберите открытый, закрытый, удаленный из abc

Но это также может быть: Выберите открыть из abc

Или Выберите открытый, закрытый от abc

Как я могу выполнить любую из этих строк, чтобы результаты возвращались в виде таблицы только со столбцами, перечисленными в операторе?

Изменить: функция написана на PL/pgSQL. И результаты будут использоваться для отчетов, где они не хотят видеть столбцы, у которых нет значений. Итак, функция, которую я написал, возвращает имена всех столбцов со значениями, а затем добавляет их в оператор SQL.

Спасибо за вашу помощь!


person user3780646    schedule 26.06.2014    source источник
comment
Когда вы говорите «функция», вы имеете в виду функцию, например, в PL/pgSQL, или вы имеете в виду функцию в вашем языке программирования общего назначения? Если второе, нам нужно будет знать язык и любую библиотеку, которую вы используете для взаимодействия с postgres. Вы можете нажать «Изменить», чтобы добавить дополнительную информацию к своему вопросу. Спасибо!   -  person Wayne Conrad    schedule 26.06.2014
comment
Может быть полезно, если вы объясните свой реальный вариант использования. Зачем вам такая вещь? Просто для отображения данных на экране? Или передать данные куда-нибудь, экспортировать их, обернуть в другой оператор, создать еще одну таблицу?   -  person Tomas Greif    schedule 26.06.2014
comment
и как вы подключены к базе данных? или вы хотите выполнить psql, скажем, в командной строке и передать ему свой запрос?   -  person Doon    schedule 26.06.2014
comment
Если у вас есть имена столбцов без доступных значений, не лучше ли отфильтровать их на уровне представления? Большинство механизмов отчетов имеют некоторые возможности сценариев.   -  person Tomas Greif    schedule 26.06.2014
comment
Вы можете выбрать результаты во временную таблицу, а затем удалить столбцы из временной таблицы: stackoverflow.com/a/1712243/238886 . Это будет медленно и некрасиво, но я не думаю, что будет какой-то красивый способ сделать то, о чем вы просите.   -  person Wayne Conrad    schedule 26.06.2014
comment
Я использую pgAdmin III. Даже если бы я использовал временную таблицу, как я могу выбрать результаты из оператора select? Используя мой пример выше, вывод моей функции представляет собой оператор выбора (SELECT открытый, закрытый FROM abc). Как я могу заставить Postgres выполнить этот оператор выбора, чтобы получить нужные мне результаты? Я вижу, что это должно быть возможно, но я не могу определить, какие типы данных должны быть для каждого столбца, потому что я не знаю, какие из них будут включены в результаты.   -  person user3780646    schedule 27.06.2014


Ответы (1)


Я не думаю, что вы можете возвращать строки непосредственно из функции, потому что ее возвращаемый тип будет неизвестен. Даже если вы указали возвращаемый тип как RECORD, вам пришлось бы перечислять возвращаемые столбцы во время вызова. Основываясь на идее Уэйна Конрада, вы можете сделать это:

CREATE FUNCTION my_create(cmd TEXT) RETURNS VOID AS $$
    BEGIN
        EXECUTE 'CREATE TEMPORARY TABLE temp_result AS ' || cmd;
    END;
$$ VOLATILE LANGUAGE plpgsql;

Затем используйте функцию следующим образом:

BEGIN;
SELECT my_create(...);
SELECT * FROM temp_result;
ROLLBACK; -- or COMMIT
person tsnorri    schedule 15.07.2014