Базовый json_to_recordset Query Получение 'функции с множественным значением, вызываемой в контексте, которая не может принять набор' - PullRequest
0 голосов
/ 07 ноября 2018

Я делаю простой json_to_recordset запрос, который, насколько я могу судить, следует шаблону в документах . Но я получаю ошибку, которую не понимаю. (Я подведу итоги своего исследования после примера кода.)

select my_schema.my_func(2, 2366800)
=>    my_func
      json
      ----------------------------------------------------
      [{"col_a":"...", "col_b":"...", "col_c":"..."}, ...]

select *
from json_to_recordset(my_schema.my_func(2, 2366800))
as results (col_a         TEXT,
            col_b         TEXT,
            col_c         NUMERIC(10,2))
=> ERROR:  set-valued function called in context that cannot accept a set

В дополнение к документам я применил свой запрос к другим примерам json_to_recordset. ( 1 , 2 , 3 ) Насколько я могу судить, мой запрос должен работать.

Я изучил ошибку set-valued function. ( 1 , 2 , 3 ; даже 4 , который говорит: «Когда функция возвращает что-то в SETOF, вам нужно обработать это как если бы это была таблица. ") К сожалению, я не нашел объяснения, почему эта ошибка происходит именно в этом конкретном запросе.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Мой другой ответ - немедленный ответ на мой вопрос, но я хочу перечислить решение отдельно, потому что решение довольно специфично для этой ситуации, в то время как ответ является общим.

Самым простым решением было бы изменить my_func, чтобы он возвращал json вместо setof json, но эта функция используется в другом месте, поэтому я хотел обработать несоответствие типов без изменения my_func.

Как уже отмечалось здесь , «Когда функция возвращает что-то SETOF, вам нужно обращаться с ней как с таблицей». Таким образом, решение включает обработку вывода my_func как таблицы (с одним значением) и передачу этой строки в функцию json_to_recordset. Боковое соединение Postgres добилось цели:

select results.*
from my_spec.my_func(2, 2366800) json,
     lateral json_to_recordset(json)
          as results (col_a         TEXT,
                      col_b         TEXT,
                      col_c         NUMERIC(10,2));
0 голосов
/ 07 ноября 2018

Как было указано в комментарии @klin, проблема заключалась в том, что my_func возвращал setof json, а json_to_recordset занимает json. Это несоответствие типов является причиной ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...