Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Вниз

Непонятность с null в хранимой процедуре   Найти похожие ветки 

 
pavel_guzhanov ©   (2008-02-11 13:44) [0]

вот такой вот кусочек хранимой процедурки:
for
 select ID from users where (-- условия)
 into :ID
do
 begin
 if (:ID is null) then
   Insert into users --ну и далее добавляется запись
 else
   begin
...


В режиме отладки смотрю, что получается. :ID получается null, но почему-то не выполяется условие if (:ID is null) then, т.е. запись не вставляется. Более того, трассировка не попадает и на следующее условие, которое else. Я предполагаю, что это связано с null. Подскажите, как еще проверить, что в таблице уже есть запись, если null не использовать?

Запрос делается for select do, т.к. в таблице может быть и несколько записей, удовлетворяющих условию отбора.


 
Desdechado ©   (2008-02-11 13:58) [1]

А что, ID может быть равен NULL ?
Уж проще IF( EXISTS( SELECT ... ) ) THEN


 
pavel_guzhanov ©   (2008-02-11 14:01) [2]


> А что, ID может быть равен NULL ?

Да, может, если в таблице нет ни одной записи, удовлетворяющей условиям выбора....


 
Desdechado ©   (2008-02-11 14:03) [3]

Если записей нет, то селект не вернет ничего. Состояние твоей переменной не изменится.


 
pavel_guzhanov ©   (2008-02-11 14:07) [4]


> Если записей нет, то селект не вернет ничего. Состояние
> твоей переменной не изменится

Видимо это у меня и происходит... и поэтому не выполняется insert. Щас попробую переделать с if exists


 
pavel_guzhanov ©   (2008-02-11 14:13) [5]

Еще вопрос. Мне все-таки при выполнении запроса нужно присвоить переменной ID полученное значение. А как это сделать, если используется if exists(select ID from users where...). Попробовал написать if exists(select ID from users where... into :ID), но, естественно, ничего не получилось. Дело в том, что в дальнейшем, при выполнении условия мне надо оперировать с этим ID


 
pavel_guzhanov ©   (2008-02-11 14:18) [6]

Вроде сделал... конечно получилось левой рукой чесать правое ухо, но отладка показала то, что мне нужно. Щас запущу загрузку данных и посмотрю, как все пройдет.

Саша, спасибо за помощь!!!


 
Sergey13 ©   (2008-02-11 14:24) [7]

> [5] pavel_guzhanov ©   (11.02.08 14:13)

Можно запросить count(*),max(id), т.е. гарантировано возвращающий результат запрос. Анализировать значение из count, вставялять, если требуется, значение из max.


 
atruhin ©   (2008-02-11 14:39) [8]

Можно проще просто завести переменную:

OID = NULL;
for
select ID from users where (-- условия)
into :OID
do
begin
if (:OID is null) then


 
ANB   (2008-02-11 16:09) [9]


> select ID from users where (-- условия)
>  into :ID


select min(ID) from users where (-- условия)

ЗЫ. Классическая грабля в оракле. Нас за это сильно по пальцам били :)


 
Desdechado ©   (2008-02-11 16:33) [10]

> Классическая грабля в оракле. Нас за это сильно по пальцам били :)
В Оракле это действительно грабля, т.к. кидает NO_DATA_FOUND.
В ibase все проще, просто в переменную ничего не заносится, значение в ней остается прежним.


 
Кщд   (2008-02-12 18:42) [11]

>Desdechado ©   (11.02.08 16:33) [10]
на агрегатных ф-циях no_data_found не получится

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE    10.2.0.2.0      Production
TNS for Linux: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

SQL> declare
 2    v_dummy char(1);
 3  begin  
 4    select min(t.dummy) into v_dummy from dual t where 1=2;
 5  end;
 6  /
Процедура PL/SQL успешно завершена.


 
Desdechado ©   (2008-02-12 19:17) [12]

> на агрегатных ф-циях no_data_found не получится
Так я и не утверждал этого. Агрегат был приведен как пример решения этой проблемы.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.073 c
3-1202313830
harisma
2008-02-06 19:03
2008.07.20
Параметры для xp_sqlmaint


6-1190538786
WhiteWolf
2007-09-23 13:13
2008.07.20
скачивание файла с сайта в котором требуеться подтверждение кода


15-1212468340
Allneed
2008-06-03 08:45
2008.07.20
как отследить событие когда флешку или дискету вставляют


2-1213966689
mefodiy
2008-06-20 16:58
2008.07.20
Удаленное подключение к серверу MySQL


15-1212669800
андр.
2008-06-05 16:43
2008.07.20
MS SQL 2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский