Oracle - Как создать процедуру с 'и', которая не требует параметров - PullRequest
2 голосов
/ 02 мая 2011

Я пытаюсь создать процедуру, которая будет сканировать все элементы в таблице, и при выполнении трех условий будет обновлено определенное значение.Вот что у меня есть, когда я указываю, что обновлять:

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 Ответ

5 голосов
/ 02 мая 2011

Использование:

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 NULL и IS NOT NULL, чтобы найти такие экземпляры, чтобы иметь с ними дело надлежащим образом
  2. release_date должен быть сохранен как ДАТА для сравнения с SYSDATE.Тип данных Oracle DATE включает время.В противном случае вам нужно использовать TO_DATE в таких столбцах (которые не будут поддерживать индекс, если он существует в release_date) для преобразования значения в DATE.
  3. Сканирование таблицы неэффективный - возможно WHERE game_id = game_id будет оптимизирован вне уравнения, но я не рекомендую практику.Аналогично для WHERE 1 = 1, если только он не используется в динамическом SQL для упрощения объединения дополнительных условий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...