Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL在plpgsql函数内创建临时表_Postgresql_Plpgsql_Temp Tables - Fatal编程技术网

PostgreSQL在plpgsql函数内创建临时表

PostgreSQL在plpgsql函数内创建临时表,postgresql,plpgsql,temp-tables,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 未清项 我知道这似乎是一项简单的任务,但我正在竭尽全力想办法解决这个问题 以下是完整的函数c

我正在尝试创建一个函数来执行以下操作:

drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * from t_rv_openitem;
有时,当涉及PostgreSQL中的函数时,我会感到困惑,并出现以下错误:

发生了一个错误:

错误:在“DROP”第3行或其附近出现语法错误:DROP TABLE 未清项

我知道这似乎是一项简单的任务,但我正在竭尽全力想办法解决这个问题

以下是完整的函数create语句:

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; 
只需添加开始和结束

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; 
如果您使用的是
语言sql
,则不需要开始和结束块,但是如果您使用的是
语言plpgsql

更新

关于
错误:“t\u rv\u openitem”的语法错误详细信息:预期的记录变量…
。代码中没有语法错误,您只需更改以下内容:

select * into t_rv_openitem from rv_openitem;
为此:

create table t_rv_openitem as
select * from rv_openitem;
仅当您在PLPGSQL之外使用时,使用
SELECT*INTO table here FROM tableSource
创建表才有效;当该代码结构位于PLPGSQL内部时,语义将不同,这意味着:

SELECT * INTO declaredVariableHere FROM tableSource;
要在独立语句和PLPGSQL内部创建表,只需使用:

CREATE TABLE AS SELECT * FROM tableSourceHere;

对不起,我不明白上面是什么?我已经添加了整个函数create语句,这是否有帮助。谢谢,但现在我得到了这个错误:“t_rv_openitem”详细信息中的语法错误:预期的记录变量、行变量或后面的标量变量列表。上下文:在第5行附近编译PL/pgSQL函数“update_t_rv_openitem”*********错误******错误:“t_rv_openitem”SQL状态的语法错误:42601详细信息:预期的记录变量、行变量或后面的标量变量列表。上下文:第5行附近PL/pgSQL函数“update_t_rv_openitem”的编译True it(
SELECT*FROM sourceTable
)在plpgsql中不起作用,但在作为独立语句运行时起作用。这让我以前也很困惑,相同的语法,但当它放在过程中时,它会有不同的语义language@DanWalmsley: