我正在尝试创建一个过程来扫描表中的所有项目,并且当满足三个条件时,它将更新某个值。以下是我指定要更新的内容时所得到的内容:
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
为 null 并且日期高于当前日期,请将 rating_id
更改为 10。此外,release_date 存储在 dd- Month-yy
格式,如果有帮助的话。
该过程编译良好,我可以正常执行,但 rating_id
仍然为空。我做错了什么?
最佳答案
用途:
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;
几点:
- NULL 不是一个值 - 它是缺少值的占位符。您需要使用
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 中使用它以使附加条件更容易连接。
关于sql - Oracle - 如何使用 'and' 创建不需要参数的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5851131/