我有以下情况,当从调用嵌套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;
答案 0 :(得分:2)
8.2真的已经过时了 - 在这个版本中,你不应该永久删除临时表。
PlpgSQL使用预准备语句,其中包含对相关表的引用的执行计划。当您删除表时,保存的计划无效 - 因为参考被破坏。在这种情况下,新版本的发布计划 - 但在8.2中并非如此。所以 - 升级或检查你的表是否存在,如果存在然后截断它而不是删除。当表不存在时,则创建它。其他解决方案 - 仅使用动态SQL。
一些注释:您不需要动态SQL用于CREATE TABLE或DROP TABLE。
http://archives.postgresql.org/pgsql-bugs/2002-07/msg00051.php