我们想使用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)
mydb=> \d test
Table "mydb.test"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer |
name | character varying(32) |
Indexes:
"idx_test_1" btree (id)
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';
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
当我调用函数func_sync_bill()时会选择一个外表,它会生成错误。
这是pgsql_fdw的错误吗?
答案 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)