【问题标题】:Select in LOOP error in PostgreSQL在 PostgreSQL 中选择循环错误
【发布时间】:2013-12-14 20:25:53
【问题描述】:

尝试启动以下函数,在 LOOP 语句中使用 SELECT 来获取其他表记录:

CREATE OR REPLACE FUNCTION parts."clearExpiredReserves"()
  RETURNS void AS
$BODY$DECLARE
    reserved_parts CURSOR FOR SELECT id, part_id, quantity FROM parts.operations_reg WHERE operation_type = 300
        AND operation_date < CURRENT_TIMESTAMP - interval '72 hours';

    spareparts_qty INT;
BEGIN
    FOR reserve_record IN reserved_parts LOOP
        SELECT p.quantity FROM parts.spareparts p WHERE p.id = reserve_record.part_id INTO spareparts_qty;

        IF spareparts_qty = reserved_parts.quantity THEN
            UPDATE parts.spareparts SET is_reserved = FALSE;
        END IF;

        DELETE FROM parts.operations_reg WHERE id = reserved_parts.id;
    END LOOP;

END;$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;

我有错误:

ERROR:  missing FROM-clause entry for table "reserved_parts"
LINE 1: SELECT spareparts_qty = reserved_parts.quantity
                                ^
QUERY:  SELECT spareparts_qty = reserved_parts.quantity
CONTEXT:  PL/pgSQL function "clearExpiredReserves" line 10 at IF

我哪里错了?

谢谢。

【问题讨论】:

  • 这里:spareparts_qty = reserved_parts.quantity --> reserved_parts是游标名,你必须使用记录名reserve_record.quantity,而不是游标。

标签: postgresql postgresql-9.1 plpgsql


【解决方案1】:

在 FOR 循环中引用当前记录时,您需要使用变量 reserve_record 而不是绑定游标 var reserved_pa​​rts。

例如,而不是

IF spareparts_qty = reserved_parts.quantity THEN

使用

IF spareparts_qty = reserved_record.quantity THEN

【讨论】:

  • 你是对的。我应该更加小心,不要在晚上工作:)
猜你喜欢
  • 2013-11-01
  • 2018-10-10
  • 1970-01-01
  • 2012-10-24
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2012-06-19
相关资源
最近更新 更多