Главная страница
    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.054 c
14-1098755050
Думкин
2004-10-26 05:44
2004.11.14
С днем рождения! 26 октября.


3-1097914633
arick
2004-10-16 12:17
2004.11.14
Проблема в подключении TSQLConnection (dbExpress)


14-1098989890
Alein
2004-10-28 22:58
2004.11.14
Интеграция драйверов в дистрибутив Windы


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


14-1098701040
вразлет
2004-10-25 14:44
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский