Postgresql 在函数结果中使用pgsql“U fdw”;错误:类型0的缓存查找失败;

Postgresql 在函数结果中使用pgsql“U fdw”;错误:类型0的缓存查找失败;,postgresql,Postgresql,我们希望使用pgsql_fdw来选择远程postgresql数据库的表。当我们 在会话中选择表是可以的,但是当我们在函数中使用外部表时 结果是“错误:类型0的缓存查找失败”。有人知道为什么吗 1.基本信息 2.目的表 3.功能 4.它在会话中工作 5.函数调用错误 当我调用函数func_sync_bill()来选择一个外部表时,它会生成错误 这是pgsql_fdw的一个bug吗?看起来像是外部数据包装器或plpgsql或其他东西中的bug。考虑到\d命令正在工作,我希望目录是好的,这表明真正的问

我们希望使用pgsql_fdw来选择远程postgresql数据库的表。当我们 在会话中选择表是可以的,但是当我们在函数中使用外部表时 结果是“错误:类型0的缓存查找失败”。有人知道为什么吗

1.基本信息 2.目的表 3.功能 4.它在会话中工作 5.函数调用错误 当我调用函数func_sync_bill()来选择一个外部表时,它会生成错误


这是pgsql_fdw的一个bug吗?

看起来像是外部数据包装器或plpgsql或其他东西中的bug。考虑到
\d
命令正在工作,我希望目录是好的,这表明真正的问题是数据损坏,尽管它在函数之外工作的事实表明可能不是这样

解决问题的方法是尝试将函数重写为SQL语言函数,而不是plpgsql,看看这是否解决了问题。如果是这样,你就有了解决办法。还可以尝试更新的PostgreSQL次要版本。如果问题解决了,那就太好了。但如果不是这样,在这种情况下,向项目报告错误可能会导致问题得到修复

  Finaly I use dynamic statements avoid the problem.
--动态语句

skytf=> CREATE or replace FUNCTION  func_sync_bill() RETURNS INTEGER  AS $$
skytf$>     BEGIN
skytf$>      begin
skytf$>         EXECUTE 'insert into test_tf (id,name) select id,name from ft_test';
skytf$>        return 0;     
skytf$>      end; 
skytf$>     END;
skytf$> $$ LANGUAGE 'plpgsql';    
CREATE FUNCTION
--再试一次

skytf=> truncate table test_tf;
TRUNCATE TABLE

skytf=> select func_sync_bill();
 func_sync_bill 
----------------
              0
(1 row)

skytf=> select count(*) from test_tf;
  count  
---------
 1990000
(1 row)

我不知道如何设置问题的格式,任何人都可以告诉我吗?如果你点击右上角的小橙色问号,格式就会得到解释。If还显示了一个链接“advanced help”(高级帮助),它会引导您:没有人能回答这个问题?最后,我在函数中使用了一个动态语句来避免这个问题。
skytf=> create table test_tf(id integer,name varchar(32));
CREATE TABLE

skytf=> insert into test_tf select * from ft_test;
INSERT 0 1990000
skytf=> truncate table test_tf;
TRUNCATE TABLE

skytf=> select func_sync_bill();
ERROR:  cache lookup failed for type 0
CONTEXT:  SQL statement "insert into test_tf (id,name) select id,name from ft_test"
PL/pgSQL function "func_sync_bill" line 5 at SQL statement
  Finaly I use dynamic statements avoid the problem.
skytf=> CREATE or replace FUNCTION  func_sync_bill() RETURNS INTEGER  AS $$
skytf$>     BEGIN
skytf$>      begin
skytf$>         EXECUTE 'insert into test_tf (id,name) select id,name from ft_test';
skytf$>        return 0;     
skytf$>      end; 
skytf$>     END;
skytf$> $$ LANGUAGE 'plpgsql';    
CREATE FUNCTION
skytf=> truncate table test_tf;
TRUNCATE TABLE

skytf=> select func_sync_bill();
 func_sync_bill 
----------------
              0
(1 row)

skytf=> select count(*) from test_tf;
  count  
---------
 1990000
(1 row)