powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select .. into Ошибка No data found
24 сообщений из 49, страница 2 из 2
select .. into Ошибка No data found
    #39641455
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас я пытаюсь это контролировать конструкцией вида:

Код: plsql
1.
If MyVar IS NOT NULL...

,

но зачем (изобретать велосипед?), если в базе и так предусмотрены штатные средства обработки исключений?
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641457
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellanДальше по ходу программы, если не контролировать значение MyVar, натыкаюсь на такую ошибкуПоменяй местами "дальше" и "раньше".
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641458
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или я путаю теплое с мягким?

Просто... Когда я этот запрос выполняю в SQL Developer, он не возвращает мне результат, из чего я и сделал вывод, что результат запроса - null.

Простите за детские ошибки, если я допускаю таковые.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641469
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fox_student,

Можно обойтись без исключений. Например так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
DECLARE S VARCHAR2(25);
BEGIN
  FOR X IN (SELECT C_LOD FROM TBL WHERE C_TYPE = 'Такого значения нет в базе') LOOP
    S := X.DEV_NAME; -- ЗНАЧЕНИЕ БУДЕТ ТОЛЬКО ЕСЛИ ОНО ЕСТЬ
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('S = '||S);
END;
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641474
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan,
Попутал автора
Щас, с этим погляжу если успею.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641478
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БельфяАгрегирующая функция sum() для пустого множества данных, возвращает null, а не пустое множество.

А пустое множество отличается от null? А как оно обозначается? И как мне проверить, что у меня результат запроса - пустое множество, а не null?
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641484
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellanА пустое множество отличается от null? А как оно обозначается? И как мне проверить, что у меня результат запроса - пустое множество, а не null?Неправильные вопросы порождают неправильные ответы. Напиши конкретно, чего ты хочешь получить запросом, распиши подробнее. Тебе (возможно) подскажут как написать правильно. А с вопросами по теории - к гуглу, они элементарны...
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641570
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan,
Вы бы конкретно сказали что хотите, это тестовый код - а что реально вас интересует?
В вашем коде MyVar всегда NULL.
Вы хотите обязательно исключение или таки что-то реальное?
Исключение - это крайний случай.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641578
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Исключение - это крайний случай.
Чойта крайний-то?
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641593
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stells2GrayMagellan,
Вы бы конкретно сказали что хотите, это тестовый код - а что реально вас интересует?
В вашем коде MyVar всегда NULL.
Вы хотите обязательно исключение или таки что-то реальное?
Исключение - это крайний случай.

Вы правы - это тестовый код, вырванный из более полного кода. Но мне его вам стыдно показывать - он наверняка вам покажется ламерским. Вообще тут у меня какая-то лабуда получается... Возможно причиной ошибки является вовсе не тот запрос, который я мучаю в тестовом примере.

Но что касается теста - всё-таки интересно, почему я не залетаю в исключение. Ведь нет разницы, что было в переменной до выполнения запроса - null или не null. По идее на момент выполнения запроса в переменную помещается null (или пустое множество, которое наверное затем все равно в null преобразуется), и это должно вызывать исключение в этом блоке.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641595
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне тогда хочется понять - а при каких условиях взводится NO_DATA_FOUND?
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641600
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan,
попробуйте примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE
    MyVar   DBA_EXTENTS.BYTES%TYPE;
    S VARCHAR2(256);
BEGIN
    S := '1. MyVar IS ' || MyVar;
    SELECT SUM(BYTES) INTO  MyVar FROM  DBA_EXTENTS WHERE OWNER = 'XXXX';
    S := S||' '||'2. SUM(BYTES) = '|| MyVar;
    SELECT NVL(SUM(BYTES),1) INTO  MyVar FROM  DBA_EXTENTS WHERE OWNER = 'XXXX';
    S := S||' '||'3. NVL(SUM(BYTES),1) = '|| MyVar;
    FOR X IN (SELECT BYTES  FROM  DBA_EXTENTS WHERE OWNER = 'XXXX') LOOP
       MyVar := X.BYTES;
       S := S||' СМОГЛИ ВЫБРАТЬ ХОТЬ ОДНУ СТРОКУ X.BYTES ='||MyVar;
    END LOOP;
    SELECT BYTES INTO  MyVar FROM  DBA_EXTENTS WHERE OWNER = 'XXXX';
    S:= S||' '||'4. SELECT BYTES =  '|| MyVar;
    DBMS_OUTPUT.PUT_LINE('S = '||S||'-> НОРМАЛЬНОЕ ЗАВЕРШЕНИЕ');
EXCEPTION  WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('S = '||S||'->'||SQLERRM);
END;
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641602
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе уже ответили, что исключение возникнет тогда, когда не будет строк в результате запроса, у тебя же применена агрегирующая функция, с которой результат будет хотя бы с одной строкой, в данном случае с null. Having спасет.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641603
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellanНо мне его вам стыдно показывать - он наверняка вам покажется ламерским.
А это вот зря, вы же что-то делаете, а не просите это сделать других. Это нормально, не стесняйтесь.
GrayMagellanНо что касается теста - всё-таки интересно, почему я не залетаю в исключение. Ведь нет разницы, что было в переменной до выполнения запроса - null или не null.

Вы не правильно интерпретируете поведение программы.
Попробуйте выполнить что я дал выше. Есть подозрение, что вы не зайдете в цикл.
Вот эти и отличается NULL от того, чего нет вообще.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641605
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellanМне тогда хочется понять - а при каких условиях взводится NO_DATA_FOUND?
Это исключение поднимается в случае применения кляузы INTO (select into, fetch into), когда курсор не вернул ни одной записи.
Если в этих же условиях курсор вернет более одной записи - поднимется too_many_rows.

Первое предназначено для отработки ситуации, когда в результате отсутствия данных переменные-приемники записи не инициализированы. Не надо путать с NULL.
Второе - для фиксации ситуации, когда логика приложения находится в противоречии с содержимым БД (нарушение целостности данных либо, что чаще, недостатки логики приложения)
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641608
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__vvp_,

простите, но как оно может что-то агрегировать, если в dba_extents нет строк с табличным пространством, имя которому 'ХХХХ'. Что агрегировать, если такого табличного пространства нет? а, я понял. вы думаете что это я подменил реальное имя на XXXX. Нет, в тексте тестового запроса так и написано. Это раз. А во-вторых, если бы запрос давал результат хотя бы с одной строкой, то SQL Developer мне бы и выдал эту самую одну строку как результат выполнения запроса? Но он ничего не возвращает!
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641609
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stells2,

выполнил. Выдало вот что:

Код: plsql
1.
S = 1. MyVar IS  2. SUM(BYTES) =  3. NVL(SUM(BYTES),1) = 1->ORA-01403: данные не найдены
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641614
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan,

Попробуй

Select sum(1), count(*)
From dual
Where 1=2
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641615
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrayMagellan__vvp_,

простите, но как оно может что-то агрегировать, если в dba_extents нет строк с табличным пространством, имя которому 'ХХХХ'. Что агрегировать, если такого табличного пространства нет? а, я понял. вы думаете что это я подменил реальное имя на XXXX. Нет, в тексте тестового запроса так и написано. Это раз. А во-вторых, если бы запрос давал результат хотя бы с одной строкой, то SQL Developer мне бы и выдал эту самую одну строку как результат выполнения запроса? Но он ничего не возвращает!

Простите, возвращает :(.

1 строка с null.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641619
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan__vvp_,

простите, но как оно может что-то агрегировать, если в dba_extents нет строк
Так и может.
Сколько строк? Ноль:

Код: plsql
1.
2.
3.
4.
5.
6.
SQL> select count(*) from dual where 1=2;
select count(*) from dual where 1=2;

  COUNT(*)
----------
         0


Однако:
Код: plsql
1.
2.
3.
4.
5.
6.
SQL> select count(*) from dual where 1=2 group by dummy;
select count(*) from dual where 1=2 group by dummy;

  COUNT(*)
---------- --строк НЕ вернул
SQL> 
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641621
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получается, что данные есть...

1 строка со значением NULL...

Тогда да, исключение NO_DATA_FOUND срабатывать не должно, т.к. в результате выполнения у меня получается 1 строка. Гм... Её значение равно NULL, помещается в MyVar, затирая предыдущее (я пытался делать
Код: plsql
1.
MyVar   DBA_EXTENTS.BYTES%TYPE DEFAULT 0;

, и тогда мне база выдавала мне 1. MyVar is not null 2. MyVar is null), после чего я попадаю на сообщение 2. MyVar is null. Все понятно. Да, надо тогда использовать
Код: plsql
1.
IF MyVar IS NULL

для контроля результатов выполнения запроса.

Спасибо большое за разъяснения. Прошу прощения за мою тупливость.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641622
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan,
Ну вот, Вы сами все увидели на практике.
Ошибка выпала, когда не было ни одной строки , вообще ничего. Вот это ничего и не может вставить хоть что-то. Т.е. дело не в NULL а в том, что нечему просто вставку делать.
т.е. в цикл мы не зашли, и тем самым обошли исключение отсутствия записи. А вот на 4 шаге напоролись, на исключение.

Если вам важно обойти исключение, т.е. корректно отработать - то код выше, который я адресовал по ошибке fox_student.
Эта комбинация позволяет ровно и предсказуемо запрограммировать логику.
Если Вам надо именно исключения отлавливать (например, писать в лог), то пример выше и документация, думаю помогут.
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641623
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan,

Отчего же не использовать исключение? Все же уже разжевали. Осталось только заставить запрос не возвращать строк )
...
Рейтинг: 0 / 0
select .. into Ошибка No data found
    #39641626
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо вам всем за разъяснения! Сейчас мне понятно стало все.
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select .. into Ошибка No data found
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]