Главная страница
    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.053 c
15-1212656826
андр.
2008-06-05 13:07
2008.07.20
MS SQL 2000 TRANSACTION


15-1212722831
Andre_s
2008-06-06 07:27
2008.07.20
Исходный код Paint-a


2-1213639653
lewka-serdceed
2008-06-16 22:07
2008.07.20
Поиск и переименование файла


2-1213871716
koss
2008-06-19 14:35
2008.07.20
Currency


15-1212725937
vajo
2008-06-06 08:18
2008.07.20
Екатеринбуржцы, помогите.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский