0

ネストされたものが呼び出されtable_generated_by_my_other_functionたときにループの最初の部分によって生成されたテーブルからデータを取得するときに、OID エラーを生成する次のような状況があります。function my_other_function()これはどのように修正できますか?

この関数function my_other_function()は、7 列のデータを 1 行だけ含むテーブルを生成します。この結果を別の方法で保存または返すことはできますか? コミットなしではテーブルが存在しないため、エラーが発生しますか?

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のみを使用します。

コメント:CREATETABLEまたはDROPTABLEには動的SQLは必要ありません。

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

于 2012-07-19T19:20:58.717 に答える