Как перебрать результаты запроса SELECT в PL / pgSQL? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь выполнить запрос SELECT, а затем для каждого из результатов я хочу напечатать что-нибудь в консоли.Однако я не получаю результатов и понятия не имею, почему.Если я запускаю SELECT самостоятельно, я делаю получаю имена таблиц.

create or replace function test()
RETURNS void AS
$body$
  DECLARE
      elem text;
  begin
  FOR elem IN
    SELECT table_name FROM information_schema.tables WHERE table_name ~ 'api_configuration_'
    LOOP
      raise notice 'Table name is: %', elem;
    END LOOP;
  end;
$body$
LANGUAGE plpgsql

Я хочу напечатать каждую table_name, найденную по запросу

1 Ответ

0 голосов
/ 12 декабря 2018

Вы исключили проблемы с видимостью (отсутствуют привилегии для таблиц интересов).См .:

RAISE NOTICE возвращает сообщения - вклканал, отличный от результатов запроса («вывод данных»).Я подозреваю одно из следующего:

  1. Глядя не в том месте?Это зависит от вашего нераскрытого клиента.В стандартном графическом интерфейсе pgAdmin III или pgAdmin4 есть отдельные вкладки для «Вывод данных» и «Сообщения» ...

  2. Is client_min_messages установлено выше NOTICE?Попробуйте RAISE WARNING в функции;не EXCEPTION, тем не менее, это сразу отменяет исполнение.Или сбросьте GUC - вы можете проверить локально в текущем сеансе, не касаясь конфигурации сервера:

    SET client_min_messages = 'NOTICE';
    

    Затем попробуйте снова.

Чтобы быстро проверить, что PL /Цикл и запрос pgSQL работают как положено, попробуйте эту эквивалентную функцию с фактическим выводом данных :

CREATE OR REPLACE FUNCTION test()
  RETURNS SETOF text AS
$func$
DECLARE
   elem text;
BEGIN
   FOR elem IN
      SELECT table_name FROM information_schema.tables
      WHERE  table_name ~ 'api_configuration_'
   LOOP
      RETURN NEXT elem;
      -- RAISE NOTICE 'Table name is: %', elem;
   END LOOP;
END
$func$  LANGUAGE plpgsql;

Вызов:

SELECT * FROM test();
...