【问题标题】:PostgreSQL CREATE TEMPORARY TABLE inside a plpgsql functionPostgreSQL 在 plpgsql 函数中创建临时表
【发布时间】:2012-04-23 08:41:21
【问题描述】:

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

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; 

【问题讨论】:

  • 对不起,我不明白上面什么?我已经添加了整个函数创建语句,有帮助吗?

标签: postgresql plpgsql temp-tables


【解决方案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; 

如果您使用 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;

【讨论】:

  • 谢谢,但现在我收到此错误:“t_rv_openitem”处的语法错误详细信息:INTO 后面的预期记录变量、行变量或标量变量列表。上下文:在第 5 行附近编译 PL/pgSQL 函数“update_t_rv_openitem”********** 错误 ********** 错误:“t_rv_openitem”处的语法错误 SQL 状态:42601 详细信息:预期记录变量、行变量或 INTO 后面的标量变量列表。上下文:PL/pgSQL 函数“update_t_rv_openitem”在第 5 行附近的编译
  • True it(SELECT * INTO newTable FROM sourceTable) 在 plpgsql 中不起作用,但是当它作为独立语句运行时它确实起作用。这也让我感到困惑,相同的语法但是当它放在程序语言中时会有不同的语义
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 2022-11-22
相关资源
最近更新 更多