Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что неправильно в скрипте?


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо