EXTRACT INTO с несколькими строками (PostgreSQL) - PullRequest
0 голосов
/ 29 ноября 2018

это моя функция:

CREATE OR REPLACE FUNCTION SANDBOX.DAILYVERIFY_DATE(TABLE_NAME regclass, DATE_DIFF INTEGER)
    RETURNS void AS $$
 DECLARE
RESULT BOOLEAN;
DATE DATE;
 BEGIN
      EXECUTE 'SELECT VORHANDENES_DATUM AS DATE, CASE WHEN DATUM IS NULL THEN FALSE ELSE TRUE END AS UPDATED FROM
      (SELECT DISTINCT DATE VORHANDENES_DATUM FROM ' || TABLE_NAME ||
       ' WHERE DATE > CURRENT_DATE -14-'||DATE_DIFF|| '  
       ) A
 RIGHT JOIN
          (
  WITH compras AS (
    SELECT ( NOW() + (s::TEXT || '' day'')::INTERVAL )::TIMESTAMP(0) AS DATUM
    FROM generate_series(-14, -1, 1) AS s
)
SELECT DATUM::DATE
FROM compras)
              B
          ON DATUM = VORHANDENES_DATUM'
     INTO date,result;
        RAISE NOTICE '%', result;
      INSERT INTO SANDBOX.UPDATED_TODAY VALUES (TABLE_NAME, DATE, RESULT);
    END;
    $$ LANGUAGE plpgsql;

Предполагается загрузить строки в таблицу SANDBOX.UPDATED_TODAY, которая содержит имя таблицы, date и boolean.boolean показывает, была ли запись для этой даты в таблице.Вся часть, которая находится внутри EXECUTE ... INTO, работает нормально и дает мне те дни.

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

Примечание: я удалил некоторые ненужные части, касающиеся этих двух параметров, которые вы можете видеть.Это вообще не имеет к этому отношения.

Ответы [ 2 ]

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

Идиоматический способ перебирать результаты динамического запроса будет

FOR date, result IN
   EXECUTE 'SELECT ...'
LOOP
   INSERT INTO ...
END LOOP;
0 голосов
/ 29 ноября 2018

Поместите оператор INSERT в EXECUTE.Вам не нужен результат SELECT ни для чего, кроме вставки его в эту таблицу, верно?Так что просто вставьте его непосредственно как часть того же запроса:

CREATE OR REPLACE FUNCTION SANDBOX.DAILYVERIFY_DATE(TABLE_NAME regclass, DATE_DIFF INTEGER)
    RETURNS void AS 
$$
BEGIN
    EXECUTE
        'INSERT INTO SANDBOX.UPDATED_TODAY
        SELECT ' || QUOTE_LITERAL(TABLE_NAME) || ', VORHANDENES_DATUM, CASE WHEN DATUM IS NULL THEN FALSE ELSE TRUE END
        FROM (
            SELECT DISTINCT DATE VORHANDENES_DATUM FROM ' || TABLE_NAME ||
            ' WHERE DATE > CURRENT_DATE -14-'||DATE_DIFF|| '  
        ) A
        RIGHT JOIN (
            WITH compras AS (
                SELECT ( NOW() + (s::TEXT || '' day'')::INTERVAL )::TIMESTAMP(0) AS DATUM
                FROM generate_series(-14, -1, 1) AS s
            )
            SELECT DATUM::DATE
            FROM compras
        ) B
            ON DATUM = VORHANDENES_DATUM';
END;
    $$ LANGUAGE plpgsql;
...