使用plpgsql中的记录的范围问题

时间:2016-03-09 18:22:02

标签: postgresql scope plpgsql dynamic-sql records

我正在尝试使用执行语句中记录的数据:

for rec1 in  SELECT * FROM table1 limit 1000 loop

    FOR loop_row IN
                    select 'geom_wgs_pois5' as col_name
          union all select 'geom_wgs_pois4' as col_name
          union all select 'geom_wgs_pois3' as col_name
          union all select 'geom_wgs_pois2' as col_name
          union all select 'geom_wgs_pois1' as col_name

    LOOP
    select rec1.loop_row into query;
    v_sql = 'select count(*)
             from   table2 a
             where  a.'||loop_row||' = '||query||'';
    execute $$v_sql$$;
    ..........

我试图将记录直接放入v_sql,但我相信这有范围问题。当我尝试将select语句用于" unpack"记录,我也得到错误。

我在字符串中创建查询然后使用execute语句的方法是故意完成的。我使用其他方法做了相同的功能,但它们太慢了。为了提高性能,我试图引用一个包含更多列的表,以避免在查询中使用大量字符串操作。

我正在使用postgres 8.2.15。我知道这是旧的,我应该升级,但这是我公司提供给我的(因此,我没有选择)。

1 个答案:

答案 0 :(得分:0)

在PostgreSQL 8.2中无法比较动态SQL中的REC。你需要最低限度的PostgreSQL 8.4,你应该使用一个USING子句。在8.2中,您必须手动比较记录中的所有字段。

有解决方法,但我不确定性能。您可以创建具有记录值的临时表,然后在动态SQL中,您可以使用表格JOIN