我正在尝试创建一个扫描表中所有项目的过程,当满足三个条件时,它将更新某个值。这是我指定更新内容时的内容:
CREATE OR REPLACE PROCEDURE NoNullRatingsForFuture(IN_GAME NUMBER) AS
BEGIN
UPDATE GAMES
SET rating_id = 10
WHERE game_id = IN_GAME;
END NoNullRatingsForFuture;
使用示例:
EXECUTE NoNullRatingsForFuture(7);
但是,我想让程序扫描整个表,并更新它,如下所示:
CREATE OR REPLACE PROCEDURE NoNullRatingsForFuture AS
BEGIN
UPDATE GAMES
SET rating_id = 10
WHERE game_id = game_id
AND rating_id = NULL
AND release_date > SYSDATE;
END NoNullRatingsForFuture;
使用示例:
EXECUTE NoNullRatingsForFuture;
基本上,如果rating
为空且日期高于当前日期,请将rating_id
更改为10.此外,如果有帮助,则release_date以dd-month-yy
格式存储。
该程序编译良好,我可以执行正常,但rating_id
仍为空。我做错了什么?
答案 0 :(得分:5)
使用:
CREATE OR REPLACE PROCEDURE NoNullRatingsForFuture AS
BEGIN
UPDATE GAMES
SET rating_id = 10
WHERE rating_id IS NULL
AND TO_DATE(release_date, 'DD-MONTH-YY') > SYSDATE;
END NoNullRatingsForFuture;
几点:
IS NULL
和IS NOT NULL
来查找适当处理它们的实例release_date
应存储为DATE,以便与SYSDATE进行比较。 Oracle DATE数据类型包括时间。否则,您需要在此类列上使用TO_DATE(如果release_date
上存在索引,则不支持索引)将值转换为DATE。WHERE game_id = game_id
可能会优化等式,但我不建议这样做。同样对于WHERE 1 = 1
,除非在动态SQL中使用它以使附加条件更容易连接。