我在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() ;
我无法解决此错误。
发生了错误:错误:表&#34; c&#34;缺少FROM子句条目 第1行:SELECT C.cantidad&lt; P.canminexp OR P.exportable = FALSE ^ QUERY:SELECT C.cantidad&lt; P.canminexp OR P.exportable = FALSE 语境:PL / pgSQL函数fn_trg_viabilidad_fila()第9行IF
我将非常感谢任何帮助。抱歉我的英文不好
答案 0 :(得分:1)
您无法访问查询之外的查询列(或您使用查询的块)。您需要将select的结果存储在某处。此外,您不应在触发的表格上运行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;
可以将查询“内联”到IF
语句中,但这样可以更好地类似于当前代码的结构。还要注意,我用一个明确且更健壮的JOIN
运算符替换了旧的,过时的隐式连接。
分配new.viable
假定idpresupuesto
是表solicitudpresupuesto
中的PK(因为您在WHERE
语句的UPDATE
子句中使用了它