0

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

该函数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;
4

1 回答 1

2

8.2 已经过时了——在这个版本中,你永远不应该删除临时表。

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

一些评论:CREATE TABLE 或 DROP TABLE 不需要动态 SQL。

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

于 2012-07-19T19:20:58.717 回答