Форум: "Базы";
Текущий архив: 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