PostgreSQL循环在访问嵌套函数生成的结果表时出错

时间:2012-07-19 15:02:18

标签: sql postgresql loops

我有以下情况,当从调用嵌套table_generated_by_my_other_function时循环的第一部分生成的表function my_other_function()中检索数据时会产生OID错误。如何解决这个问题?

函数function my_other_function()只生成一行包含7列数据的表,那么这些结果是否可以以其他方式存储或返回?我是否得到错误,因为没有提交表不存在?

function my_other_function()可以自行运行。

CREATE OR REPLACE FUNCTION my_function() RETURNS varchar AS  $$
    DECLARE 
        row_data RECORD;
        helper int;
    BEGIN 
        EXECUTE '
            DROP TABLE IF EXISTS my_table_loop_result;
        ';
        EXECUTE '
            CREATE TABLE my_table_loop_result (
                var1 varchar, var2 varchar, var3 varchar, var4 int, 
                var5 varchar, var6 varchar, var7 int)
        ';

        FOR row_data IN SELECT var_x1, var_x2 FROM my_table_too
        LOOP
                SELECT my_other_function(row_data.var_x1, row_data.var_x2) INTO helper; --Returns "1" if OK    

                INSERT INTO my_table_loop_result(var1,var2,var3,var4,var5,var6.var7)
                SELECT 
                    var1,var2,var3,var4,var5,var6,var7
                FROM table_generated_by_my_other_function --OID ERROR!
                WHERE var1 = row_data.var1;
        END LOOP;
    RETURN 1;
    END;
$$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:2)

8.2真的已经过时了 - 在这个版本中,你不应该永久删除临时表。

PlpgSQL使用预准备语句,其中包含对相关表的引用的执行计划。当您删除表时,保存的计划无效 - 因为参考被破坏。在这种情况下,新版本的发布计划 - 但在8.2中并非如此。所以 - 升级或检查你的表是否存在,如果存在然后截断它而不是删除。当表不存在时,则创建它。其他解决方案 - 仅使用动态SQL。

一些注释:您不需要动态SQL用于CREATE TABLE或DROP TABLE。

http://archives.postgresql.org/pgsql-bugs/2002-07/msg00051.php