PostgreSQL СОЗДАЕТ ВРЕМЕННУЮ ТАБЛИЦУ внутри функции plpgsql

Я пытаюсь создать функцию, которая делает это:

drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * from t_rv_openitem;

Иногда меня путают функции PostgreSQL, и я получаю такую ​​ошибку:

Произошла ошибка:

ОШИБКА: синтаксическая ошибка в строке «DROP» или рядом с ней. СТРОКА 3: DROP TABLE t_rv_openitem;

Я знаю, что это кажется простой задачей, но я выдергиваю волосы, пытаясь понять это.

Вот полный оператор создания функции:

CREATE OR REPLACE FUNCTION adempiere.update_t_rv_openitem()
  RETURNS rv_openitem AS
$BODY$

Drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * From t_rv_openitem;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION adempiere.update_t_rv_openitem() OWNER TO adempiere; 

person Dan Walmsley    schedule 11.04.2012    source источник
comment
Простите, я не понимаю над чем? Я добавил всю инструкцию create функции, это помогает.   -  person Dan Walmsley    schedule 11.04.2012


Ответы (1)


Просто добавьте BEGIN и END

CREATE OR REPLACE FUNCTION adempiere.update_t_rv_openitem()
  RETURNS rv_openitem AS
$BODY$

BEGIN -- ADD THIS

Drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * From t_rv_openitem;

END; -- AND THIS

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION adempiere.update_t_rv_openitem() OWNER TO adempiere; 

Вам не нужны блоки BEGIN и END, если вы используете LANGUAGE sql, они вам нужны, хотя если вы используете LANGUAGE plpgsql

ОБНОВЛЕНИЕ

По поводу ERROR: syntax error at "t_rv_openitem" DETAIL: Expected record variable.... В вашем коде нет синтаксической ошибки, вам просто нужно изменить это:

select * into t_rv_openitem from rv_openitem;

К этому:

create table t_rv_openitem as
select * from rv_openitem;

Создание таблицы с использованием SELECT * INTO tablehere FROM tableSource работает, только если вы используете его вне PLPGSQL; когда эта структура кода находится внутри PLPGSQL, семантика будет другой, это означает:

SELECT * INTO declaredVariableHere FROM tableSource;

Чтобы создание таблиц работало как в автономном операторе, так и внутри PLPGSQL, просто используйте:

CREATE TABLE AS SELECT * FROM tableSourceHere;
person Michael Buen    schedule 11.04.2012
comment
Спасибо, но теперь я получаю ОШИБКУ: синтаксическая ошибка в t_rv_openitem ДЕТАЛИ: ожидаемая переменная записи, переменная строки или список скалярных переменных, следующих за INTO. КОНТЕКСТ: компиляция PL / pgSQL функции update_t_rv_openitem рядом со строкой 5 ********** Ошибка ********** ОШИБКА: синтаксическая ошибка в t_rv_openitem Состояние SQL: 42601 Деталь: ожидаемая переменная записи, строка переменная или список скалярных переменных, следующих за INTO. Контекст: компиляция PL / pgSQL функции update_t_rv_openitem рядом со строкой 5 - person Dan Walmsley; 11.04.2012
comment
Верно, что он (SELECT * INTO newTable FROM sourceTable) не работает в plpgsql, но он работает, когда выполняется как автономный оператор. Это меня и раньше смущало, тот же синтаксис, но он будет иметь другую семантику, когда он будет помещен в процедурный язык. - person Michael Buen; 11.04.2012
comment
@DanWalmsley: SELECT INTO используется для этого цель в plpgsql - person Erwin Brandstetter; 12.04.2012