0

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

一、基地资料

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 的错误吗?

4

2 回答 2

1

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

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

于 2013-04-03T04:01:44.960 回答
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)
于 2013-04-07T09:40:35.813 回答