Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1099066921
t0XiC
2004-10-29 20:22
2004.11.14
Использование TStrings


10-1063214222
hilton
2003-09-10 21:17
2004.11.14
Передача интерфейса _Recordset через SocketConnection


14-1098982273
panov
2004-10-28 20:51
2004.11.14
Нарочно не придумаешь.


10-1058336312
abc
2003-07-16 10:18
2004.11.14
как организовать обратную связь в DCOM? т.е от сервера к клиенту


4-1096882304
Дмитрий Ботвин
2004-10-04 13:31
2004.11.14
Объём оперативки на сетевом компе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский