![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятность с null в хранимой процедуре [D7, FireBird 1.5.3]
pavel_guzhanov © (2008-02-11 13:44:00)вот такой вот кусочек хранимой процедурки:
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-12 19:17:00) [1]> на агрегатных ф-циях no_data_found не получится
Так я и не утверждал этого. Агрегат был приведен как пример решения этой проблемы.
Кщд (2008-02-12 18:42:00) [2]>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-11 16:33:00) [3]> Классическая грабля в оракле. Нас за это сильно по пальцам били :)
В Оракле это действительно грабля, т.к. кидает NO_DATA_FOUND.
В ibase все проще, просто в переменную ничего не заносится, значение в ней остается прежним.
ANB (2008-02-11 16:09:00) [4]
> select ID from users where (-- условия)
> into :ID
select min (ID) from users where (-- условия)
ЗЫ. Классическая грабля в оракле. Нас за это сильно по пальцам били :)
atruhin (2008-02-11 14:39:00) [5]Можно проще просто завести переменную:
OID = NULL;
for
select ID from users where (-- условия)
into :OID
do
begin
if (:OID is null) then
Sergey13 (2008-02-11 14:24:00) [6]> [5] pavel_guzhanov © (11.02.08 14:13)
Можно запросить count(*),max(id), т.е. гарантировано возвращающий результат запрос. Анализировать значение из count, вставялять, если требуется, значение из max.
pavel_guzhanov (2008-02-11 14:18:00) [7]Вроде сделал... конечно получилось левой рукой чесать правое ухо, но отладка показала то, что мне нужно. Щас запущу загрузку данных и посмотрю, как все пройдет.
Саша, спасибо за помощь!!!
pavel_guzhanov (2008-02-11 14:13:00) [8]Еще вопрос. Мне все-таки при выполнении запроса нужно присвоить переменной ID полученное значение. А как это сделать, если используется if exists(select ID from users where...). Попробовал написать if exists(select ID from users where... into :ID), но, естественно, ничего не получилось. Дело в том, что в дальнейшем, при выполнении условия мне надо оперировать с этим ID
pavel_guzhanov (2008-02-11 14:07:00) [9]
> Если записей нет, то селект не вернет ничего. Состояние
> твоей переменной не изменится
Видимо это у меня и происходит... и поэтому не выполняется insert. Щас попробую переделать с if exists
Desdechado (2008-02-11 14:03:00) [10]Если записей нет, то селект не вернет ничего. Состояние твоей переменной не изменится.
pavel_guzhanov (2008-02-11 14:01:00) [11]
> А что, ID может быть равен NULL ?
Да, может, если в таблице нет ни одной записи, удовлетворяющей условиям выбора....
Desdechado (2008-02-11 13:58:00) [12]А что, ID может быть равен NULL ?
Уж прощеIF( EXISTS( SELECT ... ) ) THEN