Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизЧто неправильно в скрипте? Найти похожие ветки
← →
alsov1 (2004-10-12 16:36) [0]Уважаемые Мастера помогите разобраться
Есть скрипт:
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
что я не так написал???
Заранее спасибо
← →
Reindeer Moss Eater © (2004-10-12 16:50) [1]begin
select что-то into что-то from что-то;
exception
when no_data_found then null;
when too_many_rows then null;
when others then null;
end
← →
Reindeer Moss Eater © (2004-10-12 16:52) [2]if SQL%NOTFOUND then
Эта конструкция только для неявных курсоров.
У тебя же никакого курсора нет. Ни явного, ни неявного.
Выборка скалярной величины.
← →
alsov1 (2004-10-12 17:09) [3]2Reindeer Moss Eater
Ругаться перестал, но данные не заносит
>>Выборка скалярной величины
А как выбрать это id если оно есть?
Неужели без создания курсора никак нельзя?
← →
alsov1 (2004-10-12 17:15) [4]Разьве не так неявный курсор объявляется:
SELECT что-то
into куда-то
FROM что-то
where что-то;
← →
Reindeer Moss Eater © (2004-10-12 17:16) [5]но данные не заносит
Патаму что их нет.
Нет данных удовлетворяющих твоему where
А как выбрать это id если оно есть?
Неужели без создания курсора никак нельзя?
Можно. Именно так, как и написано в [1]
← →
alsov1 (2004-10-12 17:23) [6]2Reindeer Moss Eater
Я писал этот скрипт исходя из такой логики:
- выбрать ид в переменную из таблицы 1
- если нет такого ид, создать новую запись в таблицу 1 и вернуть ид в переменную
- занести данные в таблизу 2, связанную с таблицей 1
по твоим предложениям получается, что если ид нет - выполнение останавливается
я парвильно понял???
← →
Reindeer Moss Eater © (2004-10-12 17:26) [7]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:32) [8]То есть делать через обработку исключительных ситуаций, а не через неявный курсор?
Просто я в хелпе вычитал вот что:
"Для анализа результата выполнения предложений 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:36) [9]Хочешь через курсор - делай через курсор.
Исключений генерироваться не будет.
Анализируй %found.
Если же курсора нет, что выборка select into обязана найти одно и только одно значение удовлетворяющее where.
Меньше одного - исключение no_data_found
Больше одного - исключение too_many_rows
← →
alsov1 (2004-10-12 17:41) [10]2Reindeer Moss Eater
Спасибо, теперь всё понятно
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c