Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Что неправильно в скрипте?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
4-1096908640
Comp
2004-10-04 20:50
2004.11.14
Подсказка ToolTip


1-1099373901
NewDelpher
2004-11-02 08:38
2004.11.14
Жуткие глюки Delphi7 в Windows 2003


14-1098736588
Soft
2004-10-26 00:36
2004.11.14
Американцы вкладывают деньги, а пашут другие.


3-1097669888
zorik
2004-10-13 16:18
2004.11.14
Computed by


1-1099412841
Владимир
2004-11-02 19:27
2004.11.14
Восстановление окон