![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что неправильно в скрипте?
alsov1 © (2004-10-12 16:36:00)Уважаемые Мастера помогите разобраться
Есть скрипт:
declare
id_tochka number;
begin
SELECT ID___TOCHKA_KONTROLYA
into id_tochka
FROM TOCHKA_KONTROLYA
where KOORDINATA_X = 1
and KOORDINATA_Y = 1
and KOORDINATA_Z = 1
and ID___MYESTO = 10;
if SQL%NOTFOUND then
--создаёт новую запись - работает точно
ADDTOCHKA_KONTROLYA(
1,
1,
1,
10,
id_tochka); --возврашает ID новой строки
end if;
--заносим ещё одну запись
AddDatchik(
1000,
'o',
to_date('10.01.04 19:45','dd.mm.yy hh24:mi'),
id_tochka);
commit;
end;
/
ругается на строчку SELECT ID___TOCHKA_KONTROLYA
говорит
ORA-01403: no data found
ORA-06512: at line 5
что я не так написал???
Заранее спасибо
alsov1 (2004-10-12 17:41:00) [1]2Reindeer Moss Eater
Спасибо, теперь всё понятно
Reindeer Moss Eater (2004-10-12 17:36:00) [2]Хочешь через курсор - делай через курсор.
Исключений генерироваться не будет.
Анализируй %found.
Если же курсора нет, что выборка select into обязана найти одно и только одно значение удовлетворяющее where.
Меньше одного - исключение no_data_found
Больше одного - исключение too_many_rows
alsov1 (2004-10-12 17:32:00) [3]То есть делать через обработку исключительных ситуаций, а не через неявный курсор?
Просто я в хелпе вычитал вот что:
"Для анализа результата выполнения предложений SELECT...INTO, INSERT, UPDATE и DELETE используются три переменные: SQL%NOTFOUND, SQL%FOUND и SQL%ROWCOUNT (Oracle закрывает курсор SQL автоматически после выполнения SQL предложения, что делает бессмысленным использование переменной SQL%ISOPEN, так как ее
значение всегда равно FALSE).
Перед выполнением предложений SELECT...INTO, INSERT, UPDATE и DELETE переменные SQL%NOTFOUND и SQL%FOUND имеют значение NULL. Переменная SQL%NOTFOUND принимает значение TRUE, если INSERT, UPDATE и DELETE не произвели изменений таблиц базы данных или SELECT...INTO не возвратил строк (при этом переменная SQL%FOUND принимает значение FALSE). В противном случае переменная SQL%NOTFOUND принимает значение FALSE, а переменная SQL%FOUND - TRUE
Вот один из примеров использования SQL%NOTFOUND для добавления новой строки в таблицу temp при сбое модификации:
UPDATE shtat SET stavka = stavka + 1 WHERE dolgn = 'доцент' AND razr = 15;
IF SQL%NOTFOUND THEN -- изменение не выполнено
INSERT INTO temp VALUES (...);
END IF;"
Reindeer Moss Eater (2004-10-12 17:26:00) [4]declare
что-то что-то.что-то%type;
begin
select что-то into что-то from что-то;
exception
when no_data_found then
-- вставить новую запись
when too_many_rows then
dbms_output.put_line('Данных больше чем надо. А надо - всего один штука');
when others then
dbms_output.put_line('Где-то еще косяк');
end;
/
alsov1 (2004-10-12 17:23:00) [5]2Reindeer Moss Eater
Я писал этот скрипт исходя из такой логики:
- выбрать ид в переменную из таблицы 1
- если нет такого ид, создать новую запись в таблицу 1 и вернуть ид в переменную
- занести данные в таблизу 2, связанную с таблицей 1
по твоим предложениям получается, что если ид нет - выполнение останавливается
я парвильно понял???
Reindeer Moss Eater (2004-10-12 17:16:00) [6]но данные не заносит
Патаму что их нет.
Нет данных удовлетворяющих твоему where
А как выбрать это id если оно есть?
Неужели без создания курсора никак нельзя?
Можно. Именно так, как и написано в [1]
alsov1 (2004-10-12 17:15:00) [7]Разьве не так неявный курсор объявляется:
SELECT что-то
into куда-то
FROM что-то
where что-то;
alsov1 (2004-10-12 17:09:00) [8]2Reindeer Moss Eater
Ругаться перестал, но данные не заносит
>>Выборка скалярной величины
А как выбрать это id если оно есть?
Неужели без создания курсора никак нельзя?
Reindeer Moss Eater (2004-10-12 16:52:00) [9]if SQL%NOTFOUND then
Эта конструкция только для неявных курсоров.
У тебя же никакого курсора нет. Ни явного, ни неявного.
Выборка скалярной величины.
Reindeer Moss Eater (2004-10-12 16:50:00) [10]begin
select что-то into что-то from что-то;
exception
when no_data_found then null;
when too_many_rows then null;
when others then null;
end