在函数结果中使用pgsql_fdw“错误:类型0的缓存查找失败”

时间:2012-06-25 09:37:32

标签: postgresql

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

1。基础信息

skytf=> \d ft_test;
       Foreign table "skytf.ft_test"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(32) | 
Server: pgsql_srv


skytf=> \des+ pgsql_srv
                                                List of foreign servers
   Name    | Owner | Foreign-data wrapper | Access privileges | Type | Version |                Options                 
-----------+-------+----------------------+-------------------+------+---------+----------------------------------------
 pgsql_srv | skytf | pgsql_fdw            |                   |      |         | {host=127.0.0.1,port=1923,dbname=mydb}
(1 row)

2。目的地表

mydb=> \d test
             Table "mydb.test"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | 
 name   | character varying(32) | 
Indexes:
    "idx_test_1" btree (id)

3。功能

 CREATE or replace FUNCTION  func_sync_bill() RETURNS INTEGER  AS $$
    BEGIN

     begin
      insert into test_tf (id,name) select id,name from ft_test;
      return 1;
     end; 
    END;
  $$ LANGUAGE 'plpgsql';

4。它适用于会话

skytf=> create table test_tf(id integer,name varchar(32));
CREATE TABLE

skytf=> insert into test_tf select * from ft_test;
INSERT 0 1990000

5。函数调用错误

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

当我调用函数func_sync_bill()时会选择一个外表,它会生成错误。

这是pgsql_fdw的错误吗?

2 个答案:

答案 0 :(得分:1)

看起来像是外来数据包装器或plpgsql中的错误。鉴于\d命令正在运行,我希望目录很好,这表明真正的问题是数据损坏,尽管它在函数外部工作的事实表明可能情况并非如此。

要解决的问题是尝试将您的函数重写为SQL语言函数而不是plpgsql,看看是否能解决问题。如果是的话,你有一个解决方法。还可以尝试更新的PostgreSQL次要版本。如果问题得到解决,那就很好了。但如果没有,这是一个错误报告项目可能导致问题得到解决的情况。

答案 1 :(得分:0)

  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)
相关问题