HAWQ是否在周期中不支持SQL(同时或对于,使用plpgsql)和#xFF1F;
今天,我使用循环中的insert语句定义了一个函数。但是HAWQ返回了一个错误:HAWQ是否在周期中不支持SQL(同时或对于,使用plpgsql)和#xFF1F;,sql,database,loops,hawq,Sql,Database,Loops,Hawq,今天,我使用循环中的insert语句定义了一个函数。但是HAWQ返回了一个错误: ERROR: could not serialize unrecognized node type: 43983632 (outfast.c:4742) CONTEXT: SQL statement "insert into t(id,value) values(1,0.1)" PL/pgSQL function "test_function" line 6 at SQL statement 我做了一些测试,
ERROR: could not serialize unrecognized node type: 43983632 (outfast.c:4742)
CONTEXT: SQL statement "insert into t(id,value) values(1,0.1)"
PL/pgSQL function "test_function" line 6 at SQL statement
我做了一些测试,发现当我在循环中使用“insert语句”时,它会被报告为错误。
如果我删除相关的“插入语句”,它可以正常运行
以下是一个测试示例:
CREATE或REPLACE FUNCTION test\u FUNCTION()
将int返回为
$BODY$
声明
整数;
开始
编号:=1;
虽然number您希望避免使用HAWQ的单例语句,但我有点惊讶它不起作用。您将希望改用基于集合的操作
CREATE TABLE t (id int, value numeric);
CREATE OR REPLACE FUNCTION test_function() RETURNS int AS
$BODY$
declare
number int;
begin
insert into t (id, value) select 1, 0.1 from generate_series(1, 10);
return 10;
end
$BODY$
LANGUAGE plpgsql;
对于这样一个简单的示例,您可以使用sql函数,它比plpgsql具有更少的开销
DROP FUNCTION test_function();
CREATE OR REPLACE FUNCTION test_function() RETURNS void AS
$BODY$
insert into t (id, value) select 1, 0.1 from generate_series(1, 10);
$BODY$
LANGUAGE sql;
这两个函数都在一条语句中完成所有工作,而不是执行10个单独的语句。我在HAWQ和这两项工作中都进行了测试
如果必须使用HAWQ在循环中执行单例insert语句,这里有一个解决方法
CREATE OR REPLACE FUNCTION test_function()
RETURNS int AS
$BODY$
declare
number int;
v_sql text;
begin
number := 1;
while number <= 10 loop
v_sql := 'insert into t(id,value) values(1,0.1)';
execute v_sql;
number := number+1;
end loop;
return number;
end
$BODY$
LANGUAGE plpgsql ;
CREATE或REPLACE FUNCTION test\u FUNCTION()
将int返回为
$BODY$
声明
整数;
v_sql文本;
开始
编号:=1;
虽然数字这实际上是hawq 2.0中已经解决的问题。你可以参考最新的
结果如下:
CREATE TABLE t (id INT, value DOUBLE PRECISION);
CREATE TABLE
CREATE OR REPLACE FUNCTION test_function()
RETURNS int AS
$BODY$
declare
number int;
begin
number := 1;
while number <= 10 loop
insert into t(id, value) values(1, 0.1);
number := number+1;
end loop;
return number;
end
$BODY$
LANGUAGE plpgsql;
CREATE FUNCTION
SELECT test_function();
test_function
---------------
11
(1 row)
SELECT * FROM t;
id | value
----+-------
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
(10 rows)
SELECT * FROM test_function();
test_function
---------------
11
(1 row)
SELECT * FROM t;
id | value
----+-------
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
1 | 0.1
(10 rows)
创建表t(id INT,值双精度);
创建表
创建或替换函数测试_函数()
将int返回为
$BODY$
声明
整数;
开始
编号:=1;
谢谢。这就是我想要的。