SELECT.. INTO для создания таблицы в PL/pgSQL
Я хочу использовать SELECT INTO
для создания временной таблицы в одной из моих функций. SELECT INTO
работает в SQL, но не PL/pgSQL.
Этот оператор создает таблицу с именем mytable (If orig_table
существует как отношение):
SELECT *
INTO TEMP TABLE mytable
FROM orig_table;
Но поместите эту функцию в PostgreSQL, и вы получите сообщение об ошибке: ERROR: "temp" is not a known variable
CREATE OR REPLACE FUNCTION whatever()
RETURNS void AS $$
BEGIN
SELECT *
INTO TEMP TABLE mytable
FROM orig_table;
END; $$ LANGUAGE plpgsql;
Я могу SELECT INTO
переменную типа record
в PL/pgSQL, но тогда я должен определить структуру при получении данных из этой записи. SELECT INTO
действительно просто - автоматически создается таблица той же структуры запроса SELECT
. Кто-нибудь объясняет, почему это не работает внутри функции?
Похоже, что SELECT INTO
работает по-разному в PL/pgSQL, потому что вы можете выбрать в объявленные вами переменные. Однако я не хочу объявлять свою временную структуру таблиц. Я бы хотел, чтобы он просто создал структуру автоматически, как в SQL.
Ответы
Ответ 1
Попробуйте
CREATE TEMP TABLE mytable AS
SELECT *
FROM orig_table;
Per http://www.postgresql.org/docs/current/static/sql-selectinto.html
CREATE TABLE AS функционально подобен SELECT INTO. CREATE TABLE AS является рекомендуемым синтаксисом, поскольку эта форма SELECT INTO недоступна в ECPG или PL/pgSQL, потому что они интерпретируют предложение INTO по-разному. Кроме того, CREATE TABLE AS предлагает надмножество функций, предоставляемых SELECT INTO.