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

时间:2011-05-01 20:20:45

标签: sql oracle stored-procedures plsql

我正在尝试创建一个扫描表中所有项目的过程,当满足三个条件时,它将更新某个值。这是我指定更新内容时的内容:

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仍为空。我做错了什么?

1 个答案:

答案 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;

几点:

  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中使用它以使附加条件更容易连接。