PostgreSQL 触发器错误
Error in PostgreSQL trigger
我在 postgreSQL 中编写这个触发器
CREATE OR REPLACE FUNCTION fn_trg_viabilidad_fila()
RETURNS trigger AS
$BODY$
BEGIN
PERFORM S.*
FROM MontoMinimo M, SolicitudPresupuesto S, Cantidad C, Producto P
WHERE P.idProducto=C.idProducto
and C.idPresupuesto=S.idPresupuesto
and M.idMonto=S.idMonto;
IF (C.cantidad < P.canMinExp OR P.exportable = FALSE)
THEN
UPDATE SolicitudPresupuesto
SET viable = FALSE
WHERE idPresupuesto = OLD.idPresupuesto;
RETURN NEW;
END IF;
END
$BODY$
LANGUAGE plpgsql
CREATE TRIGGER trg_viabilidad_fila BEFORE INSERT
OR UPDATE ON SolicitudPresupuesto
FOR EACH ROW EXECUTE PROCEDURE
fn_trg_viabilidad_fila() ;
我无法解决这个错误..
An error has occurred: ERROR: missing FROM-clause entry for table "c"
LINE 1: SELECT C.cantidad < P.canminexp OR P.exportable = FALSE ^
QUERY: SELECT C.cantidad < P.canminexp OR P.exportable = FALSE
CONTEXT: PL/pgSQL function fn_trg_viabilidad_fila() line 9 at IF
如果有任何帮助,我将不胜感激。抱歉我的英语不好
您无法访问查询之外的查询列(或您使用查询的块)。您需要将 select 的结果存储在某处。此外,您不应该 运行 在触发的 table 上设置 UPDATE
,您需要将值分配给 NEW
记录。
CREATE OR REPLACE FUNCTION fn_trg_viabilidad_fila()
RETURNS trigger AS
$BODY$
DECLARE
l_result boolean;
BEGIN
SELECT (c.cantidad < p.canMinExp OR p.exportable = FALSE)
INTO l_result
FROM MontoMinimo M
JOIN SolicitudPresupuesto s ON m.idMonto = s.idMonto
JOIN Cantidad c ON c.idPresupuesto = s.idPresupuesto
JOIN Producto p ON p.idProducto = c.idProducto;
IF l_result THEN
new.viable := false;
END IF;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql;
可以将查询 "inline" 放入 IF
语句中,但这样它更类似于您当前代码的结构。另请注意,我用显式且更强大的 JOIN
运算符替换了旧的、过时的隐式连接。
分配 new.viable
假定 idpresupuesto
是 table solicitudpresupuesto
中的 PK(因为您在 WHERE
子句中使用了 [= =11=]语句)
我在 postgreSQL 中编写这个触发器
CREATE OR REPLACE FUNCTION fn_trg_viabilidad_fila()
RETURNS trigger AS
$BODY$
BEGIN
PERFORM S.*
FROM MontoMinimo M, SolicitudPresupuesto S, Cantidad C, Producto P
WHERE P.idProducto=C.idProducto
and C.idPresupuesto=S.idPresupuesto
and M.idMonto=S.idMonto;
IF (C.cantidad < P.canMinExp OR P.exportable = FALSE)
THEN
UPDATE SolicitudPresupuesto
SET viable = FALSE
WHERE idPresupuesto = OLD.idPresupuesto;
RETURN NEW;
END IF;
END
$BODY$
LANGUAGE plpgsql
CREATE TRIGGER trg_viabilidad_fila BEFORE INSERT
OR UPDATE ON SolicitudPresupuesto
FOR EACH ROW EXECUTE PROCEDURE
fn_trg_viabilidad_fila() ;
我无法解决这个错误..
An error has occurred: ERROR: missing FROM-clause entry for table "c" LINE 1: SELECT C.cantidad < P.canminexp OR P.exportable = FALSE ^ QUERY: SELECT C.cantidad < P.canminexp OR P.exportable = FALSE CONTEXT: PL/pgSQL function fn_trg_viabilidad_fila() line 9 at IF
如果有任何帮助,我将不胜感激。抱歉我的英语不好
您无法访问查询之外的查询列(或您使用查询的块)。您需要将 select 的结果存储在某处。此外,您不应该 运行 在触发的 table 上设置 UPDATE
,您需要将值分配给 NEW
记录。
CREATE OR REPLACE FUNCTION fn_trg_viabilidad_fila()
RETURNS trigger AS
$BODY$
DECLARE
l_result boolean;
BEGIN
SELECT (c.cantidad < p.canMinExp OR p.exportable = FALSE)
INTO l_result
FROM MontoMinimo M
JOIN SolicitudPresupuesto s ON m.idMonto = s.idMonto
JOIN Cantidad c ON c.idPresupuesto = s.idPresupuesto
JOIN Producto p ON p.idProducto = c.idProducto;
IF l_result THEN
new.viable := false;
END IF;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql;
可以将查询 "inline" 放入 IF
语句中,但这样它更类似于您当前代码的结构。另请注意,我用显式且更强大的 JOIN
运算符替换了旧的、过时的隐式连接。
分配 new.viable
假定 idpresupuesto
是 table solicitudpresupuesto
中的 PK(因为您在 WHERE
子句中使用了 [= =11=]语句)