首页 > 解决方案 > 在没有 PL/pgSQL 的情况下迭代 PostgreSQL 中的选择结果

问题描述

我目前正在开发一个系统,用于处理学校建筑中不同的班级和隔间预订。我有这样一种方式,当您预订教室时,您会自动预订其中的每个隔间。

我需要在不使用 PL/pgSQL 的情况下迭代纯 SQL 中的选择结果来实现此保留,因为在查询之前并不清楚教室有多少个隔间。

我已经尝试过 PL/pgSQL,虽然它运行良好,但我需要一种不使用 PL/pgSQL 来满足类要求的方法。这是我的带有FOR关键字的 PL/pgSQL 实现的示例。

CREATE OR REPLACE FUNCTION createReservationClass(p_codeBuilding CHAR(2),p_codeClass INT,p_CIP VARCHAR(8),p_date DATE,p_startPeriod INT,p_endPeriod INT,p_description VARCHAR(1024))
RETURNS VOID
AS $$
    FOR temprow IN SELECT CODE_CUBICULE  FROM public.CUBICULE where CODE_BUILDING = p_codeBuilding AND CODE_CLASS = p_codeClass
    LOOP
        SELECT createReservationCubicule(p_codeBuilding, p_codeClass, temprow.CODE_CUBICULE, p_CIP, p_date, p_startPeriod, p_endPeriod, p_description);
    END LOOP;
END;
$$
LANGUAGE PLPGSQL;

我希望当我得到一个建筑物编号和一个教室编号时,它会自动保留它也有的每个隔间。我不确定我是否有正确的方法来解决是否有更简单的方法。

唯一的要求是我不允许使用 PL/pgSQL 来编写我的函数。

标签: sqlpostgresqlplpgsql

解决方案


为什么不使用 PL/pgSQL的奇怪要求?但是,您可以使用 SQL 函数轻松完成。

停止程序化思考,开始思考 SQL。您想要做的事情可以通过没有(显式)循环的单个查询来完成:

SELECT createReservationCubicule(
          p_codeBuilding,
          p_codeClass,
          CODE_CUBICULE,
          p_CIP,
          p_date,
          p_startPeriod
          p_endPeriod,
          p_description
       )
FROM public.CUBICULE
where CODE_BUILDING = p_codeBuilding
  AND CODE_CLASS = p_codeClass;

推荐阅读