Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 for select ...... into do update В интербазе а в оракле подобное как?  [new]
1234512345
Member

Откуда:
Сообщений: 209
Есть в таблице поле в нем забит адрес (Улица Левая, д.34 , кв.44) нужно разнести улицу в поле улица в этой же таблице дом в поле дом квартира в поле квартира.
Address | Улица | Дом | Квартира|
Улица Левая, д.34 , кв.44 | | | |
18 июн 07, 11:06    [4279052]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
OraDen
Member

Откуда:
Сообщений: 828
Update вам в помощь
18 июн 07, 11:15    [4279093]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18336
Задача разбора адресной строки суть задача неблагодарная, но сам принцип обновления довольно прост:
SQL> create table ane_test(Addr varchar2(50), Street varchar2(30), House varchar2(10), Flat varchar2(10));

Table created

SQL> insert into ane_test values('Улица Левая, д.34 , кв.44','','','');

1 row inserted

SQL> commit;

Commit complete

SQL> update ane_test
  2  set Street = substr(Addr, 1, instr(Addr,',')-1)
  3    , House = substr(Addr, instr(Addr,',',1,1)+1, instr(Addr,',',1,2)-instr(Addr,',',1,1)-1)
  4    , Flat = substr(Addr, instr(Addr,',',1,2)+1, nvl(nullif(instr(Addr,',',1,3),0),length(addr))-instr(Addr,',',1,2)-1)
  5  ;

1 row updated

SQL> select * from ane_test;

ADDR                                               STREET                         HOUSE      FLAT
-------------------------------------------------- ------------------------------ ---------- ----------
Улица Левая, д.34 , кв.44                          Улица Левая                     д.34       кв.4

SQL> rollback;

Rollback complete

SQL> drop table ane_test;

Table dropped

SQL> 
18 июн 07, 11:32    [4279178]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
1234512345
Есть в таблице поле в нем забит адрес (Улица Левая, д.34 , кв.44) нужно разнести улицу в поле улица в этой же таблице дом в поле дом квартира в поле квартира.
Address | Улица | Дом | Квартира|
Улица Левая, д.34 , кв.44 | | | |

declare 
  address varchar2(250);
  street varchar2(250);
  ID number;
begin
  for rec in (select id, Address from Table) loop
    ID := rec.ID;
    address := rec.Address;
    street := SUBSTRB(...);
    ...
    update Table
    set Street = street, ...
    where ID = ID;
  end loop;
end
18 июн 07, 11:37    [4279203]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Shurik55
    update Table
    set Street = street, ...
Ну очень удачный пример :)
18 июн 07, 11:46    [4279262]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
Jannny
Shurik55
    update Table
    set Street = street, ...
Ну очень удачный пример :)

да ладно уж :) Еще бы про ... сказал бы :)
18 июн 07, 11:51    [4279287]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18336
Shurik55
да ладно уж :) Еще бы про ... сказал бы :)

Да не ладно, а достаточно неприятная и сложнодиагностируемая бага.
И не "сказал", а "сказала".
Janny, респект! ;)
18 июн 07, 11:53    [4279298]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
andrey_anonymous
Да не ладно, а достаточно неприятная и сложнодиагностируемая бага.
И не "сказал", а "сказала".
Janny, респект! ;)

Сорри, не посмотрел профайл.
Чем же она сложнодиагностируема? Апдейт по ПК, данные не перетираются другими. Выявляется после первого запуска.
18 июн 07, 12:03    [4279368]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Shurik55
Чем же она сложнодиагностируема?
Подходом :)

Shurik55
Апдейт по ПК.
Всех строк таблицы... :))
18 июн 07, 12:13    [4279424]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18336
Shurik55
Чем же она сложнодиагностируема?

Ну вот, например, было дело...
18 июн 07, 12:16    [4279440]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
Jannny
Подходом :)

Как у любая другая очепятка.
Jannny
Всех строк таблицы... :))

Если быть внимательным, то можно увидить фильтр. Даже если его не видно то все равно замена будет происходит для каждой записи своим же значением.
18 июн 07, 12:21    [4279466]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Shurik55
Если быть внимательным, то можно увидить фильтр.
Видимо у меня с внимательностью напряг :) какой именно фильтр позволит избежать "касания" каждой строки таблицы?

Ну а вообще сам подход тоже не особо(особенно прои условии написанного первого ответа) - писать так, когда достаточно одного апдейта...
18 июн 07, 12:27    [4279513]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Shurik55
Если быть внимательным, то можно увидить фильтр.
Кстати вот это ИМХО очень хороший ответ на Ваш же собственный вопрос по поводу неприятности таких именований :)
18 июн 07, 12:29    [4279525]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
Jannny
Видимо у меня с внимательностью напряг :) какой именно фильтр позволит избежать "касания" каждой строки таблицы?

Ну а вообще сам подход тоже не особо(особенно прои условии написанного первого ответа) - писать так, когда достаточно одного апдейта...

1. по ПК.
2. Одного апдейта не достаточно, так как условий для правильного(хотя-бы 70 %) парсинга нужен курсор. Уместить все в один апдейт будет ну очень проблематично, да еще потом почти несопровождаемо.
18 июн 07, 12:30    [4279541]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Shurik55
Jannny
Видимо у меня с внимательностью напряг :) какой именно фильтр позволит избежать "касания" каждой строки таблицы?
1. по ПК.
Только не в Вашем коде.

Shurik55
2. Одного апдейта не достаточно, так как условий для правильного(хотя-бы 70 %) парсинга нужен курсор. Уместить все в один апдейт будет ну очень проблематично, да еще потом почти несопровождаемо.
Переведите плиз....

Shurik55
Уместить все в один апдейт будет ну очень проблематично, да еще потом почти несопровождаемо.
Да ладно, и это при условии, что такой апдейт уже есть в этой ветке???
18 июн 07, 12:37    [4279605]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
OraDen
Member

Откуда:
Сообщений: 828
Shurik55
2. Одного апдейта не достаточно, так как условий для правильного(хотя-бы 70 %) парсинга нужен курсор. Уместить все в один апдейт будет ну очень проблематично, да еще потом почти несопровождаемо.
Так надо было привести свой вариант парсинга строки адреса, а вы схематично изобразили управляющую структуру да еще и не рабочую, по вашему автор топика сможет понять в чем ошибка?
18 июн 07, 12:40    [4279626]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
OraDen
Member

Откуда:
Сообщений: 828
Касательно цикла по курсору: Using Cursor FOR Loops
18 июн 07, 12:57    [4279757]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18336
Shurik55
2. Одного апдейта не достаточно, так как условий для правильного(хотя-бы 70 %) парсинга нужен курсор. Уместить все в один апдейт будет ну очень проблематично, да еще потом почти несопровождаемо.

Не могу согласиться.
Если предполагается сложный парсер, то что мешает именно парсер оформить хранимой функцией и использовать ее в запросе?
Что до сопровождаемости... Тоже тонкая материя. Очень многое зависит от стиля и умения комментировать код.
Не стоит быть столь категоричным, кмк.
18 июн 07, 13:01    [4279782]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
1234512345
Member

Откуда:
Сообщений: 209
Shurik55
1234512345
Есть в таблице поле в нем забит адрес (Улица Левая, д.34 , кв.44) нужно разнести улицу в поле улица в этой же таблице дом в поле дом квартира в поле квартира.
Address | Улица | Дом | Квартира|
Улица Левая, д.34 , кв.44 | | | |

declare 
  address varchar2(250);
  street varchar2(250);
  ID number;
begin
  for rec in (select id, Address from Table) loop
    ID := rec.ID;
    address := rec.Address;
    street := SUBSTRB(...);
    ...
    update Table
    set Street = street, ...
    where ID = ID;
  end loop;
end

declare 
  address varchar2(250);
  street varchar2(250);
  ID number;
begin
  for rec in (select id, Address from Table) loop
    ID := rec.ID;
    address := rec.Address;
    street := SUBSTRB(...);
    ...
    update Table
    set Street = street, ...
    where street = rec.street;
  end loop;
end
[/quot]
18 июн 07, 16:38    [4281349]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Elic
Member

Откуда:
Сообщений: 29976
1234512345
  for rec in (select id, Address from Table) loop
    update Table
    set Street = street, ...
    where street = rec.street;
[/quot]Стало ещё хуже
18 июн 07, 16:46    [4281412]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
Стало ещё хуже
Ну почему - ошибка синтаксиса однозначно лучше :)

to автор: а чем Вам простой update не подошел? Я так понимаю, сам алгоритм у Вас был ещё на этапе Interbase отточен, так что с ним нет проблем.
18 июн 07, 17:00    [4281507]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Dmitry E. Loginov
Member

Откуда: Москва
Сообщений: 108
Читать про select .... for update of .... и update .... where current of ....;
Выглядеть будет примерно так:
declare
  cursor cStr is select id, Address, Street, ...
    from Table
   FOR UPDATE OF Street, ...;
begin
  for rStr in cStr loop
    rStr.Street := ....;
    update Table set Street=rStr.Street, ... 
      where current of cStr;
  end loop;
end;
Минус - в том, что записи будут заблокированы все, даже те, которые, возможно не придётся изменять.

Обычный цикл
 for rec in (select id, Address from Table) loop
    ID := rec.ID;
    address := rec.Address;
    street := SUBSTRB(...);
    ...
    update Table
    set Street = street, ...
    where ID = ID;
  end loop;
опасен тем, что за время с момента открытия курсора цикла, до момента исполнения update записи могут быть изменены другими пользователями и update - затрёт эти изменения.
18 июн 07, 17:51    [4281846]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
OraDen
Member

Откуда:
Сообщений: 828
1234512345
declare 
  address varchar2(250);
  street varchar2(250);
  ID number;
begin
  for rec in (select id, Address from Table) loop
    ID := rec.ID;
    address := rec.Address;
    street := SUBSTRB(...);
    ...
    update Table
    set Street = street, ...
    where street = rec.street;
  end loop;
end
И что по вашему получится в результате? Вы себе создайте табличку, прогоните варианты, попробуйте понять почему получилось то что получилось , может хоть немного разбираться начнете.


Dmitry E. Loginov
Обычный цикл
 for rec in (select id, Address from Table) loop
    ID := rec.ID;
    address := rec.Address;
    street := SUBSTRB(...);
    ...
    update Table
    set Street = street, ...
    where ID = ID;
  end loop;
опасен тем, что за время с момента открытия курсора цикла, до момента исполнения update записи могут быть изменены другими пользователями и update - затрёт эти изменения.

Этот цикл опасен не только тем о чем вы написали, он вообще не решает задачу, в нем заложена грубая ошибка, нельзя давать переменным, которые вы используете в DML, имена совпадающие с именами столбцов, об этом пол топика написано, может хватит тиражировать глючный код.
18 июн 07, 18:25    [4282055]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
Dmitry E. Loginov
опасен тем, что за время с момента открытия курсора цикла, до момента исполнения update записи могут быть изменены другими пользователями и update - затрёт эти изменения.

Класс. Транзакции к чему? Так рассуждая можно прийти к тому, что с базой вообще лучше не работать, так как затереть можно данные :)

OraDen

Этот цикл опасен не только тем о чем вы написали, он вообще не решает задачу, в нем заложена грубая ошибка, нельзя давать переменным, которые вы используете в DML, имена совпадающие с именами столбцов, об этом пол топика написано, может хватит тиражировать глючный код.

Да уж, грубее не придумаешь. Максимум что будет в результате - это аналогичные данные, такие как и были до старта запроса. Обычная очепятка, которая проявляется после запуска запроса и проверки результата. А задачу не решает потому как решить задачу парсинга в топике форума нереально.
19 июн 07, 09:32    [4283394]     Ответить | Цитировать Сообщить модератору
 Re: for select ...... into do update В интербазе а в оракле подобное как?  [new]
Shurik55
Member

Откуда:
Сообщений: 897
Dmitry E. Loginov
опасен тем, что за время с момента открытия курсора цикла, до момента исполнения update записи могут быть изменены другими пользователями и update - затрёт эти изменения.

Если туго с транзакциями, то такой запрос запускают как правило один раз и ночью или когда все отключенны от базы.
19 июн 07, 09:44    [4283446]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить