#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. конечно. никаких проблем.