Использование COALESCE против ИСКЛЮЧЕНИЯ, когда строки не возвращаются (Oracle)

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

В настоящее время я сталкиваюсь с ошибкой, из-за которой я получаю сообщение об ошибке «ДАННЫЕ НЕ НАЙДЕНЫ», когда я запускаю хранимую процедуру, которая определяет / выбирает в переменные, которые я настроил.

Я пробовал два разных метода. Одно объединение столбца и null (как показано ниже):

 BEGIN
  BEGIN
      SELECT COALESCE (max_value, 0) AS MAX_VALUE
        INTO v_max_v
        FROM table1
       WHERE car_code = rcar;
      --
      SELECT COALESCE (min_value, 0) AS MIN_VALUE
        INTO v_in_v
        FROM table1
       WHERE car_code = rcar;
  END
END;
  

Другой метод заключается в обработке исключения, когда для КАЖДОЙ переменной не возвращаются строки.

 BEGIN
  BEGIN
      SELECT max_value AS MAX_VALUE
        INTO v_max_v
        FROM table1
       WHERE car_code = rcar;
  EXCEPTION
     WHEN NO_DATA_FOUND
     THEN v_max_v := NULL;
  END
      --
      SELECT min_value AS MIN_VALUE
        INTO v_min_v
        FROM table1
       WHERE car_code = rcar;
  EXCEPTION
     WHEN NO_DATA_FOUND
     THEN v_min_v := NULL;
  END
END;
  

Какой метод является более эффективным / менее дорогостоящим? Есть ли объективный способ проверить самому? (объясните планы, которые работают только с запросами, я полагаю)

Заранее спасибо.

Комментарии:

1. Они не выполняют одно и то же. Вы все еще можете получить NO_DATA_FOUND ошибку, используя COALESCE() . Следовательно, вы должны использовать второе, потому что это не то, что вы хотите.

2. Тьфу, я тупой. Спасибо, что прояснили это для меня. Не уверен, каким был ход моих мыслей, когда я сделал это предположение.

Ответ №1:

NO_DATA_FOUND не просто соответствует тому, является ли какое-либо значение нулевым или нет. Это скорее тип исключения по умолчанию, используемый для уведомления / обработки того, существуют записи или нет.

Ваше сравнение неверно. Первый вариант вообще не связан ни с каким исключением: он просто проверяет и заменяет значение, если оно равно null, и не имеет дела с каким-либо исключением. Но в другом случае блок исключения существует, но бесполезен до тех пор, пока не возникнет ситуация, когда строк не существует, а не то, что значение данных или столбца равно null.

С точки зрения производительности первый вариант быстрее, хотя и не добавляется дополнительный код исключения, но вы можете встроить то же самое, и разницы не будет.

Комментарии:

1. Ах, я должен вернуться к своей книге по SQL 101. В своей опрометчивости я, должно быть, предположил, что это было правильно, мои извинения.

2. конечно. никаких проблем.