EXTRACT INTO 多行 (PostgreSQL)

EXTRACT INTO with multiple rows (PostgreSQL)

这是我的职能:

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;

应该将行上传到 table SANDBOX.UPDATED_TODAY,其中包含 table 名称、一个 date 和一个 booleanboolean 显示 table 中是否有该日期的条目。 EXECUTE ... INTO 内的整个部分工作正常,给了我那些日子。

但是,此代码仅插入查询结果的第一行。我想要的是插入所有 14 行。显然,我需要将其更改为类似循环或完全不同的东西,但它究竟如何工作?

旁注:关于您可以看到的这 2 个参数,我删除了一些不必要的部分。完全没有关系。

将 INSERT 语句放在 EXECUTE 中。除了将 SELECT 的结果插入 table 之外,您不需要其他任何东西,对吧?所以只需将其作为同一查询的一部分直接插入即可:

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;

loop through dynamic query results 的惯用方式是

FOR date, result IN
   EXECUTE 'SELECT ...'
LOOP
   INSERT INTO ...
END LOOP;