0

pgsql_fdwを使用して、リモートのpostgresqlデータベースのテーブルを選択します。セッションでテーブルを選択すると問題ありませんが、関数で外部テーブルを使用すると、「エラー:タイプ0のキャッシュルックアップに失敗しました」と表示されます。誰かが理由を知っていますか?

1.基本情報

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、カタログは正常であると予想されます。これは、実際の問題はデータの破損であることを示唆していますが、関数の外で機能するという事実は、そうではない可能性があることを示唆しています.

トラブルシューティングを行うには、関数を plpgsql ではなく SQL 言語関数として書き直して、問題が解決するかどうかを確認してください。その場合は、回避策があります。また、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 に答える