在plpgsql函数中的PostgreSQL CREATE TEMPORARY TABLE

时间:2012-04-11 02:59:33

标签: postgresql plpgsql temp-tables

我正在尝试创建一个执行此操作的函数:

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 statement:

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; 

1 个答案:

答案 0 :(得分:3)

只需添加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; 

如果您使用LANGUAGE sql,则不需要BEGIN和END阻止,如果您使用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;