Agora queremos usar pgsql_fdw para selecionar uma tabela de banco de dados postgresql remoto,Quando selecionamos a tabela em uma sessão, está tudo bem, mas quando usamos a tabela externa em uma função, ocorre "ERRO: falha na pesquisa de cache para o tipo 0" , alguém sabe, obrigado!
--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
quando chamo a função func_sync_bill() que vai selecionar uma tabela estrangeira, dá o erro. Isso é um bug do pgsql_fdw?
--verbose meeage
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
Alguém enviou recentemente um relatório de bug formal que parece idêntico à sua pergunta. Sem qualquer acompanhamento até agora.
Se o problema for uma incompatibilidade entre a implementação de pgsql_fdw e a maneira como o interpretador plpgsql prepara suas consultas, o uso de EXECUTE pode ajudar:
Isso força o plpgsql a evitar o pré-processamento da consulta e, de alguma forma, é a solução genérica contra esse tipo de erro.
Mas, de qualquer forma, parece que pgsql_fdw é bastante experimental no momento, não está incluído no diretório contrib do PostgreSQL e seu código-fonte surpreendentemente não está disponível para download em: http://sourceforge.net/projects/interdbconnect/files/ onde nós esperaria isso. Atualmente, você pode ter mais sucesso com dblink , o "jeito antigo".