RJP*_*RJP 2 sql oracle plsql stored-procedures
我正在尝试创建一个扫描表中所有项目的过程,当满足三个条件时,它将更新某个值.这是我指定要更新的内容时的内容:
CREATE OR REPLACE PROCEDURE NoNullRatingsForFuture(IN_GAME NUMBER) AS
BEGIN
UPDATE GAMES
SET rating_id = 10
WHERE game_id = IN_GAME;
END NoNullRatingsForFuture;
Run Code Online (Sandbox Code Playgroud)
用法示例:
EXECUTE NoNullRatingsForFuture(7);
Run Code Online (Sandbox Code Playgroud)
但是,我想让程序扫描整个表,并更新它,如下所示:
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;
Run Code Online (Sandbox Code Playgroud)
用法示例:
EXECUTE NoNullRatingsForFuture;
Run Code Online (Sandbox Code Playgroud)
基本上,如果rating为null且日期高于当前日期,则将rating_id其更改为10.此外dd-month-yy,如果有帮助,release_date将以格式存储.
那个程序编译得很好,我可以执行正常,但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;
Run Code Online (Sandbox Code Playgroud)
几点:
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中使用它以使附加条件更容易连接.