ОШИБКА: тип строки результата удаленного запроса не соответствует указанному типу строки в предложении FROM при удаленном вызове функции

#postgresql #function

#postgresql #функция

Вопрос:

При вызове функции, которая возвращает две переменные 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:

В моем сценарии я получаю точно такую же ошибку.

ОШИБКА: тип строки результата удаленного запроса не соответствует указанному типу строки в предложении FROM

У меня есть ПРЕДСТАВЛЕНИЕ с использованием dblink, и изначально я создаю представление с помощью «SELECT *», и оно работает нормально, но через некоторое время мои запросы начали завершаться сбоем.

 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 …», и мои запросы, использующие это представление, в порядке.

 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);