6

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

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; 
4

1 回答 1

4

只需添加 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;
于 2012-04-11T03:21:58.227 回答