多行提取(PostgreSQL)

时间:2018-11-29 16:21:59

标签: postgresql plpgsql dynamic-sql

这是我的功能

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和一个booleanboolean显示表中是否有该日期的条目。 EXECUTE ... INTO内部的整个部分工作正常,给了我那些日子。

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

侧面说明:我删除了一些与您可以看到的那两个参数有关的不必要的部分。完全没有关系。

2 个答案:

答案 0 :(得分:1)

将INSERT语句放在EXECUTE内。除了将SELECT的结果插入该表外,您不需要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;

答案 1 :(得分:0)

到达loop through dynamic query results的惯用方式是

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