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

标签 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 为 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;

几点:

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

关于sql - Oracle - 如何使用 'and' 创建不需要参数的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5851131/

相关文章:

php - MySQL简单查询

MySql 通过排除另一个表中的所有 id 进行选择

sql - 如何查询GROUP BY一年中的月份

java - 从 java.util.Date 转换为 java.sql.Date

SQL Server 存储过程默认值

php - 如何从 "threads"表上相关线程的行中检索自动递增编号?

mysql - SQL 查询计数(x)并按 y 分组

sql - Oracle Sql 如果存在则做这个否则做那个

java - MyBatis注解调用Stored Procedure并获取Out Params

sql-server - 如何从存储过程返回bool