需要执行的原始PL/pgSQL匿名块代码如下:
do $$
declare
tt integer[];
minRowNum integer;
maxRowNum integer;
MIN_TEMS constant integer := 1;
MAX_TEMS constant integer := 15;
LAST_ARR_IDX constant integer := MAX_TEMS * 2;
NUM_FILAS constant integer := 1000;
begin
create temp table NTematica(rownum, tematica_id) as
select
S.n, (S.n * 841)::integer
from
generate_series(1,357) S(n);
select
min(X.rownum), max(X.rownum) into minRowNum, maxRowNum
from
NTematica X;
prepare selectTematicasPlan(integer, integer, integer, integer) as
select
array_agg(X.tematica_id)
from
NTematica X
where
X.rownum in
(
select
trunc(random() * ($2 - $1 + 1) + $1) :: integer
from
generate_series($3, trunc(random() * ($4 - $3 + 1) + $3) :: integer)
);
for i in 1..NUM_FILAS loop
execute selectTematicasPlan(minRowNum, maxRowNum, MIN_TEMS, MAX_TEMS);
raise notice 'First is % and % are the others', tt[1], tt[2:LAST_ARR_IDX];
end loop;
drop table NTematica cascade;
deallocate selectTematicasPlan;
end$$;
然后,执行过程中出现错误:
ERROR: syntax error at or near "("
LINE 34: tt := execute selectTematicasPlan(minRowNum, maxRowNum...
然后,为了测试,我删除了 "tt :=" 并再次运行它,得到了以下结果:
ERROR: function selecttematicasplan(integer, integer, integer, integer) does not exist
LINE 1: SELECT selectTematicasPlan(minRowNum, maxRowNum, MIN_TEMS, M...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
更新:
提前感谢大家。我要澄清一些问题:
我的初始代码是一个“插入选择”(包括CTE)来填充一个有1000万条记录的表。我可以确认它非常慢。因此,我决定选择一种命令式解决方案:创建一个带索引的未记录表(类似于映射数据结构),并循环1000万次以从“映射”中“执行”数据“选择”,然后进行数据“插入”。我将“select”和“insert”从循环中提取到准备好的语句中,因为这避免了PG的1000万个解析工作。发布的代码只涉及我使用准备好的语句时遇到的问题。
在pl/pgsql代码块中是否可以使用“prepare”+“execute”?PG文档(http://www.postgresql.org/docs/9.4/static/sql-prepare.html,http://www.postgresql.org/docs/9.4/static/sql-execute.html)没有对pl/pgsql进行说明(支持或反对)。
注:我的数据库版本(“select version()”)是: PostgreSQL 9.4.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2, 64-bit