Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.20;
Скачать: CL | DM;

Вниз

Непонятность с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
2-1214205706
i
2008-06-23 11:21
2008.07.20
Быстрый список для индексирования....


11-1191960858
ElectriC
2007-10-10 00:14
2008.07.20
Проблема с KeyPreview


2-1213686301
MaryM
2008-06-17 11:05
2008.07.20
Проконсультируйте по работе с объемными файлами


15-1212697734
No_Dead
2008-06-06 00:28
2008.07.20
Автоподстройка заблокир.


11-1191827466
Nikfel
2007-10-08 11:11
2008.07.20
Получить список файлов и папок.