现在我们想用 pgsql_fdw 来选择一个远程 postgresql 数据库的表,当我们在会话中选择表时是好的,但是当我们在一个函数中使用外部表时结果是 "ERROR: cache lookup failed for type 0" ,有谁知道,谢谢!
--1 base informaiton
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 destination table
mydb=> \d test
Table "mydb.test"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer |
name | character varying(32) |
Indexes:
"idx_test_1" btree (id)
--3 function
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 it works in a session
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 function call error
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 的错误吗?
--详细的信息
skytf=> \set VERBOSITY verbose
skytf=> select func_sync_bill();
ERROR: XX000: 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
LOCATION: getTypeOutputInfo, lsyscache.c:2441
最近有人提交了一份正式的错误报告,看起来与您的问题相同。至今没有任何后续。
如果问题是 pgsql_fdw 实现与 plpgsql 解释器准备查询的方式不匹配,使用EXECUTE可能会有所帮助:
这迫使 plpgsql 避免对查询进行预处理,并且它在某种程度上是针对此类错误的通用解决方法。
但无论如何,目前 pgsql_fdw 看起来还是相当实验性的,它不包含在 PostgreSQL contrib 目录中,而且它的源代码令人惊讶地无法在以下位置下载:http: //sourceforge.net/projects/interdbconnect/files/会期待的。目前,您可能会通过“旧方式” dblink获得更多成功。