Postgresql 在函数结果中使用pgsql“U fdw”;错误:类型0的缓存查找失败;
我们希望使用pgsql_fdw来选择远程postgresql数据库的表。当我们 在会话中选择表是可以的,但是当我们在函数中使用外部表时 结果是“错误:类型0的缓存查找失败”。有人知道为什么吗 1.基本信息 2.目的表 3.功能 4.它在会话中工作 5.函数调用错误 当我调用函数func_sync_bill()来选择一个外部表时,它会生成错误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的一个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)