错误:在远程函数调用上,远程查询结果行类型与指定的FROM子句行类型不匹配

时间:2019-03-25 18:23:14

标签: postgresql function

调用返回两个OUT变量作为记录类型的函数时,将引发上述错误。

我已经创建了此远程功能:

CREATE OR REPLACE FUNCTION public.get_del(rpt_map 
json, OUT del_qry text, OUT start_date date)
 RETURNS record
 LANGUAGE plpgsql
AS $function$
declare rpts json;rpt_list text[]; 
begin

select to_char(now()::date - interval '3 Years', 'YYYY-01-01')::date 
into start_date;

rpt_list = (ARRAY(SELECT json_object_keys(rpt_map)));

del_qry = (select string_agg('delete from rpt.' || rpt || 
                  ' where dt < ''' || start_date || '', E';\n')
           from unnest(rpt_list) as rpt)::text;

end;
$function$

我试图这样称呼它:

SELECT t.del_qry, t.start_date
FROM dblink('my_conn', 'select public.get_del(''' || rpt_map || ''')') 
AS t(del_qry text, start_date date);

我收到此错误:

SQL Error [42804]: ERROR: remote query result rowtype does not match the 
specified FROM clause rowtype

1 个答案:

答案 0 :(得分:0)

在我的情况下,我得到完全相同的错误。

错误:远程查询结果行类型与指定的FROM不匹配 子句行类型

我有一个使用dblink的VIEW,最初我使用“ SELECT *”创建了一个VIEW,它可以正常工作,但是过一会儿我的查询开始失败。

CREATE OR REPLACE VIEW public.my_table
 AS
 SELECT remote_data.field1, remote_data.field2, remote_data.field3
FROM dblink('hostaddr=<IP> port=<port> dbname=<my_db> user=<user> password=<pass>'::text,
'SELECT * FROM public.one_table::text) AS remote_data(field1 bigint, field2 text, field3 date);

在调查过程中,我意识到错误与SELECT语句中字段的顺序有关。

因此我将“ SELECT *”更改为“ SELECT field1,field2,field3 ...”,并且使用此VIEW的查询是可以的。

CREATE OR REPLACE VIEW public.my_table
 AS
 SELECT remote_data.field1, remote_data.field2, remote_data.field3
FROM dblink('hostaddr=<IP> port=<port> dbname=<my_db> user=<user> password=<pass>'::text,
'SELECT field1, field2, field3 FROM public.one_table::text) AS remote_data(field1 bigint, field2 text, field3 date);