Mik*_*eck 6 postgresql function execute temp-tables syntax-error
我正在尝试创建一个引用PostgreSQL 8.4中的临时表的函数.基于我的研究,似乎最好的方法是使用EXECUTE命令从定义的字符串执行我的查询.
不幸的是,我在尝试创建函数时遇到奇怪的语法错误.
我目前的功能定义如下:
CREATE OR REPLACE FUNCTION example() RETURNS void AS $$
EXECUTE 'INSERT INTO table1 (col1, col2, col3) SELECT col1, col2, col3 from temp_table';
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ERROR: syntax error at or near "'INSERT INTO table1 (col1, col2, col3) SELECT col1, col2, col3 from temp_table'"
LINE 2: execute 'INSERT INTO table1 (col1, col2, col3) SELECT col1...
Run Code Online (Sandbox Code Playgroud)
无论字符串文字中的实际内容如何,我似乎都得到了同样的错误.
我的问题是,1)使用EXECUTE特性的正确语法是什么,2)是否有更好的方法来编写这样一个引用临时表的函数?
mu *_*ort 13
我认为你的问题是你正在使用的语言.EXECUTE SQL语言:
EXECUTE用于执行先前准备的语句.由于预准备语句仅在会话期间存在,因此预准备语句必须由PREPARE先前在当前会话中执行的语句创建.
通常,您需要在PL/pgSQL函数中生成动态命令,即每次执行时都会涉及不同表或不同数据类型的命令.PL/pgSQL正常尝试缓存命令计划(如第39.10.2节所述)在这种情况下不起作用.为了处理这类问题,
EXECUTE提供了以下声明:Run Code Online (Sandbox Code Playgroud)EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ];
当您想要使用PL/pgSQL EXECUTE(将字符串作为SQL执行)时,您正在使用SQL EXECUTE(执行预准备语句).
试试这个:
CREATE OR REPLACE FUNCTION example() RETURNS void AS $$
BEGIN
EXECUTE 'INSERT INTO table1 (col1, col2, col3) SELECT col1, col2, col3 from temp_table';
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
或者,另一个似乎更接近你似乎想要做的事情的例子:
create or replace function example(tname text) returns void as $$
begin
execute 'insert into ' || tname || ' (name) values(''pancakes'')';
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
这将插入'pancakes'到表中,您将tname参数传递给函数.