这是它应该如何工作: 我有一个名为Pro2的表,其中一个名为finall的列是一个日期,另一个名为validade。如果finall已经发生或正在发生,则验证被设置为0。
BEGIN
FOR validade in (SELECT * FROM PRO2 WHERE TRUNC(finall)<= TRNCU(SYSDATE))
LOOP
SET validade = 0
END LOOP;
END;
我是PL / SQL的新手请帮忙!
答案 0 :(得分:0)
您的第二个TRUNC
命令中有错误。
您不应将validade
(CURSOR
}设置为任何值。
PL / SQL中的赋值运算符为:=
而非SET
。
试试这个:
BEGIN
FOR r_record IN (SELECT *
FROM PRO2
WHERE TRUNC(finall) <= TRUNC(SYSDATE))
LOOP
UPDATE PRO2 t1
SET t1.validade = 0
WHERE t1.id = r_record.id;
END LOOP;
END;
你不应该使用PL / SQL来做这件事!
尽可能使用SQL!
UPDATE PRO2
SET validade = 0
WHERE TRUNC(finall) <= TRUNC(SYSDATE);
答案 1 :(得分:0)
每个设计良好的Oracle表都有一个主键,通常称为 id 或以其结尾。这就是亚历克斯所说的t1.id.您应该要求为PRO2制作主键的列(-combination)并替换它。
显示的UPDATE之类的DML代码可以包含在PLSQL中,并且确实是最好的解决方案:
BEGIN
-- other things here ....
UPDATE pro2
SET validade = 0
WHERE TRUNC( finall ) <= TRUNC( SYSDATE );
-- and here ...
END;