Oracle - 如何使用不需要参数的'和'创建过程

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仍然是空的.我究竟做错了什么?

OMG*_*ies 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;
Run Code Online (Sandbox Code Playgroud)

几点:

  1. NULL不是一个值 - 它是缺少一个的占位符.您需要使用IS NULLIS NOT NULL查找此类实例以适当地处理它们
  2. release_date应被存储为DATE,以比较SYSDATE.Oracle DATE数据类型包括时间.否则,您需要在这些列上使用TO_DATE(如果存在索引,则不支持索引release_date)将值转换为DATE.
  3. 扫描表格效率不高 - 它可能WHERE game_id = game_id会在等式中进行优化,但我不推荐这种做法.同样WHERE 1 = 1,除非在动态SQL中使用它以使附加条件更容易连接.