powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Скрипт update or insert по изменению только
102 сообщений из 102, показаны все 5 страниц
Скрипт update or insert по изменению только
    #38859309
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Помогите сформировать скрипт.

К примеру, такой скрипт, он изменяет все записи или добавляет:

Код: sql
1.
2.
3.
4.
5.
6.
7.
update or insert into T (fld1, fld2, fld3, fld4, fld5, fld6, fld7)
values (1, 2, 3, 4, 5, 6, 7)
matching (fld1, fld2, fld3);

update or insert into T (fld1, fld2, fld3, fld4, fld5, fld6, fld7)
values (...)
matching (fld1, fld2, fld3);


...

А мне надо что-то типа такого:

Код: sql
1.
2.
3.
4.
5.
6.
7.
update or insert into T (fld1, fld2, fld3, fld4, fld5, fld6, fld7)
values (1, 2, 3, 4, 5, 6, 7)
matching (fld1, fld2, fld3)
if exists (select fld1 from T where fld1=1 and fld2=2 and fld3=3 and fld4=4 and fld5=5 and fld6=6 and fld7=7);

update or insert into T (fld1, fld2, fld3, fld4, fld5, fld6, fld7)
values ...



Но как это правильно написать (Firebird 2.5) ?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859323
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

смотри merge
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859328
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Денис.

Посмотрел merge - ничо ваще не понял.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859357
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

Читать до просветления.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859386
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
merge она тоже делает update или insert, а мне надо по условию - либо делать, либо нет
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859388
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

Я уже до помутнения прочитал
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859397
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

вообще то в merge можно не указывать предложение update, и тогда этот оператор и будет как раз таки производить вставку либо нет.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859405
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyЯ уже до помутнения прочитал
а что читаешь, если не секрет?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859406
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Не пойму что Вы мне предлагаете
мне надо по условию - по 7-ми полям - если по ним совпадение, то не делать ни update ни insert, а если нет совпадения то делать update если по 3-м полям совпадение или insert если записи с такими 3-мя полями нет.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859408
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvlabyЯ уже до помутнения прочитал
а что читаешь, если не секрет?

http://www.firebirdsql.org/refdocs/langrefupd21-merge.html
http://firebirdsql.su/doku.php?id=update_or_insert
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859413
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859432
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Спасибо, но хрен редьки не слаще
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859434
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Походу задача нерешаемая!
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859453
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyмне надо по условию - по 7-ми полям - если по ним совпадение, то не делать ни
update ни insert, а если нет совпадения то делать update если по 3-м полям совпадение или
insert если записи с такими 3-мя полями нет.
Ну пиши EXECUTE BLOCK и там наворачивай свою через-жопу-хитровывернутую логику сколько хочешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859454
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

execute block может что угодно. Но даже без него решение есть

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
MERGE INTO T
USING (SELECT
           1 AS FLD1,
           2 AS FLD2,
           3 AS FLD3,
           4 AS FLD4,
           5 AS FLD5,
           6 AS FLD6,
           7 AS FLD7
       FROM
           RDB$DATABASE
       WHERE NOT EXISTS(SELECT
                            *
                        FROM
                            T
                        WHERE FLD1 = 1
                          AND FLD2 = 2
                          AND FLD3 = 3
                          AND FLD4 = 4
                          AND FLD5 = 5
                          AND FLD6 = 6
                          AND FLD7 = 7)) SRC
ON T.FLD1 = SRC.FLD1
   AND T.FLD2 = SRC.FLD2
   AND T.FLD3 = SRC.FLD3
WHEN MATCHED THEN
    UPDATE SET FLD4 = SRC.FLD4,
               FLD5 = SRC.FLD5,
               FLD6 = SRC.FLD6,
               FLD7 = SRC.FLD7
WHEN NOT MATCHED THEN
    INSERT (
        FLD1,
        FLD2,
        FLD3,
        FLD4,
        FLD5,
        FLD6,
        FLD7)
    VALUES (SRC.FLD1,
            SRC.FLD2,
            SRC.FLD3,
            SRC.FLD4,
            SRC.FLD5,
            SRC.FLD6,
            SRC.FLD7)  



просто надо включать мозг. В трёшке это можно сделать немного проще
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859455
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyПоходу задача нерешаемая!ХП
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859472
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

execute block может что угодно. Но даже без него решение есть

просто надо включать мозг. В трёшке это можно сделать немного проще

Да, я не верю в Execute block - там понятно if ...

А тут опупеть!!!

То есть если в USING пустое множество, то ничего происходить не будет?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859475
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lady,

хотя это merge сделает не совсем то что нужно. Пиши execute block.

В трёшке можно вот так выкрутится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
MERGE INTO T
USING (SELECT
           1 AS FLD1,
           2 AS FLD2,
           3 AS FLD3,
           4 AS FLD4,
           5 AS FLD5,
           6 AS FLD6,
           7 AS FLD7
       FROM
           RDB$DATABASE) SRC
ON T.FLD1 = SRC.FLD1
   AND T.FLD2 = SRC.FLD2
   AND T.FLD3 = SRC.FLD3
WHEN MATCHED THEN
    UPDATE SET FLD4 = SRC.FLD4,
               FLD5 = SRC.FLD5,
               FLD6 = SRC.FLD6,
               FLD7 = SRC.FLD7
WHEN NOT MATCHED AND T.FLD4 <> 4 AND T.FLD5 <> 5 AND T.FLD6 <> 6 AND T.FLD7 <> 7  THEN
    INSERT (
        FLD1,
        FLD2,
        FLD3,
        FLD4,
        FLD5,
        FLD6,
        FLD7)
    VALUES (SRC.FLD1,
            SRC.FLD2,
            SRC.FLD3,
            SRC.FLD4,
            SRC.FLD5,
            SRC.FLD6,
            SRC.FLD7) 



А вообще задача странная.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859481
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyДа, я не верю в Execute block

это ещё почему? Все вроде верят
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859485
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovlabyмне надо по условию - по 7-ми полям - если по ним совпадение, то не делать ни
update ни insert, а если нет совпадения то делать update если по 3-м полям совпадение или
insert если записи с такими 3-мя полями нет.
Ну пиши EXECUTE BLOCK и там наворачивай свою через-жопу-хитровывернутую логику сколько хочешь.


Через какую жопу???? Я просто хочу что если уже такая запись есть то не дергать триггера и не обновлять даты изменений

блок наверное так будет:

EXECUTE BLOCK
AS
BEGIN
if not exists (select fld1 from T where fld1=1 and fld2=2 and fld3=3 and fld4=4 and fld5=5 and fld6=6 and fld7=7) then
update or insert into T (fld1, fld2, fld3, fld4, fld5, fld6, fld7)
values (1, 2, 3, 4, 5, 6, 7)
matching (fld1, fld2, fld3);
END
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859487
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyТо есть если в USING пустое множество, то ничего происходить не будет?

не будет. Доку надо читать внимательнее.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859488
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyДа, я не верю в Execute block - там понятно if ...

А что так? Религия?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859495
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисlabyДа, я не верю в Execute block

это ещё почему? Все вроде верят

Ну это как-то не совсем sql, - если да кабы, а не сразу хочу!
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859499
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyЯ просто хочу что если уже такая запись есть то не дергать триггера и не
обновлять даты изменений
Запись идентифицируется ключом. А у тебя - какой-то хренью.

И нет, нормальный блок будет не такой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859502
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

а проктостоматологические задачи обычно через чистый SQL не решаются
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859508
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlady,

хотя это merge сделает не совсем то что нужно. Пиши execute block.

В трёшке можно вот так выкрутится
...
А вообще задача странная.

не lady, а laby

Такое дело - обновление КАЛДР ... в общую базу со своими правилами. На каждой таблице скрипт по изменениям, которые делают всякие гадости. Когда пару миллионов записей изменяю, начинаются всякие процессы по пересылке этих записей в тысячу других баз данных по всей стране ... Хотя большинство записей фактически не трогаются. Но и сами update or insert выполняются не так уж быстро - миллион записей около 2-х часов ...
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859517
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

нормальные люди передают только изменения. А не всю табличку каждый раз. Тут репликация нужна. Хочешь сам пиши, хочешь купи готовый репликатор. В любом случае каждый раз перекидывать миллионы (хорошо не миллиарды) записей, причём большая часть из них не менялась это как раз и есть через жопу.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859518
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovlabyЯ просто хочу что если уже такая запись есть то не дергать триггера и не
обновлять даты изменений
Запись идентифицируется ключом. А у тебя - какой-то хренью.

И нет, нормальный блок будет не такой.


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

А какой?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859521
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Нормальные люди изъясняются понятным языком.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859527
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

что не понятного. В мастер базе ведётся логирование изменений в триггерах. Потом по результатам этих изменений получается скрипт, который выполняется на подчинённых базах. Про репликаторы тебе Dimitry Sibiryakov больше расскажет.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859534
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

каждый раз перекидывать миллионы (хорошо не миллиарды) записей, причём большая часть из них не менялась это как раз и есть через жопу.

Напомню название темы "Скрипт update or insert по изменению только "
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859535
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyА какой?
FOR SELECT с WHERE по трём полям, внутри проверка оставшихся четырёх и соответствующее
действие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859536
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

что не понятного. В мастер базе ведётся логирование изменений в триггерах. Потом по результатам этих изменений получается скрипт, который выполняется на подчинённых базах. Про репликаторы тебе Dimitry Sibiryakov больше расскажет.

Кто в мастер-базе ведет это логгирование изменений?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859544
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

в принципе тебе наверное и первый merge который я написал подойдёт. Попробуй его.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859549
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovlabyА какой?
FOR SELECT с WHERE по трём полям, внутри проверка оставшихся четырёх и соответствующее
действие.


А чем if не угодил?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859553
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyКто в мастер-базе ведет это логгирование изменений?

сама мастер база конечно. С помощью триггеров повешенных на соответствующие таблицы.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859566
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисlabyКто в мастер-базе ведет это логгирование изменений?

сама мастер база конечно. С помощью триггеров повешенных на соответствующие таблицы.

А оно надо ФНС России
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859573
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис С помощью триггеров повешенных на соответствующие таблицы.
там вообще dbf
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859579
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

а ну да. Если БД источник не твоя тогда пожалуй я не прав.

Первый merge подходит?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859588
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyА чем if не угодил?
Твой - тем что стоит снаружи и имеет внутри exists. В результате этого твой код в 2-3 раза
медленнее работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859689
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,
Первый merge подходит?

Пробую ... не так быстро - у меня же там не fld1, fld2 ...
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859725
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labyСимонов Денисlaby,
Первый merge подходит?

Пробую ... не так быстро - у меня же там не fld1, fld2 ...

Вроде работает, буду тогда пробывать через merge
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859877
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labylabyпропущено...


Пробую ... не так быстро - у меня же там не fld1, fld2 ...

Вроде работает, буду тогда пробывать через merge

Из IBExpert работает сформированный скрипт merge, а через tpFIBScript не работает, хотя update or insert работал
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38859931
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

как имено не работает. Ошибку пишет или нет нужного результата выполнения. Если ошибку то какую?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38860822
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

как имено не работает. Ошибку пишет или нет нужного результата выполнения. Если ошибку то какую?

Спасибо большое Денис!
Ничо не пишет тупо ничего не делает. Ну я в цикле через TpFibQuery по одному выполняю, вроде выполняется ...
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861006
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то мне подсказывает, что merge слишком новорочена, позволяет не только как у меня сливать с таблицей по одной записи, а может можно сформировать целую вторую таблицу, а затем слить одним оператором merge?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861013
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

может и так.

Можно например в одной транзакции залить сначала GTT простым insert без всяких проверок, а потом в ней же запустить merge который будет разруливать конфликты. Сам решай как лучше сделать.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861019
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

может и так.

Можно например в одной транзакции залить сначала GTT простым insert без всяких проверок, а потом в ней же запустить merge который будет разруливать конфликты. Сам решай как лучше сделать.

Дело в том что мне потом надо будет удалить все записи, которых в новой редакции нет. А чтобы их вычленить нужна наверное вторая таблица так как по dbf искать будет проблематично.

А что такое GTT ?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861025
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyА что такое GTT ?

Временная таблица. Записи из которой удаляются автоматом или по коммиту тразакции или по дисконнекту.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861028
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

глобальная временная таблица http://www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes217.html#rnfb210-globaltemp Данные в ней существуют только на время транзакции или коннекта. Делай эту таблицу такой же структуры как твой dbf. Просто переливаешь туда данные. А потом в какой нибудь хранимой процедуре они у тебя копируются в нормальную табличку с отсечением дубликатов, обновлением полей и удалением.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861049
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

глобальная временная таблица http://www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes217.html#rnfb210-globaltemp Данные в ней существуют только на время транзакции или коннекта. Делай эту таблицу такой же структуры как твой dbf. Просто переливаешь туда данные. А потом в какой нибудь хранимой процедуре они у тебя копируются в нормальную табличку с отсечением дубликатов, обновлением полей и удалением.

Зачем же мне dbf - Я лучше сделаю ту же структуру что у меня.
Но GTT чтото сложновато, может простую сделать ...
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861054
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

А потом в какой нибудь хранимой процедуре они у тебя копируются в нормальную табличку с отсечением дубликатов, обновлением полей и удалением.

Как раз надо отсечь не дубликаты, а наоборот старые которых в новой нет.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861058
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

лучше GTT. В общем-то она не сложнее обычной таблицы.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861060
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

Просто переливаешь туда данные. А потом в какой нибудь хранимой процедуре они у тебя копируются в нормальную табличку с отсечением дубликатов, обновлением полей и удалением.

то есть от merge отказаться???
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861066
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

почему? Тут просто задача разбивается на два этапа. Сначала льёшь данные в GTT. А потом из этой GTT обработку делаешь и распихиваешь свои данные в обычную таблицу(ы). А уж каким способом это делать merge или не merge пофиг. Но если учитывать что ты собираешься удалять по не совпадению, то тут одним merge не обойдёшься.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861067
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyто есть от merge отказаться???

Ну тебе уже раньше советовали хранимую процедуру писать или execute block пользовать ;) Откуда ж мы знаем, что для тебя и твоей задачи лучше? Нам за это денег не платят ;)
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861069
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GTT лажа какая-то индексы не создаются не фига
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861073
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

почему? Тут просто задача разбивается на два этапа. Сначала льёшь данные в GTT. А потом из этой GTT обработку делаешь и распихиваешь свои данные в обычную таблицу(ы). А уж каким способом это делать merge или не merge пофиг. Но если учитывать что ты собираешься удалять по не совпадению, то тут одним merge не обойдёшься.

Вот я потом и собираюсь в моей временной-поверенной таблице смотреть, если нет такой записи, то удалять. Но в GTT индекс мне не создало так что я не знаю, как без индексов смотреть
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861092
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

не гони. Индексы там прекрасно создаются. Кинь сюда скрипт создания GTT и индекса к ней
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861102
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

не гони. Индексы там прекрасно создаются. Кинь сюда скрипт создания GTT и индекса к ней

Хорошо, гоню. Виноват. Каюсь.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861119
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyмне потом надо будет удалить все записи, которых в новой редакции нет.
Такого merge даже в тройке не умеет. В Оракуле merge такое умеет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861521
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создание таблицы без ошибок, а при добавлении пишет типа не знает таблицу, хотя создание индексов и триггеров тоже не ругается, знает а insert не знает. В ibexpert тоже знает и insert ...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    qryWrite.Transaction.StartTransaction;
    qryWrite.SQL.Clear;
    qryWrite.SQL.Append(
      'CREATE GLOBAL TEMPORARY TABLE KLADR_DOM_NEW (' +
        'ID_KLADR_DOM            D_ID_MAIN NOT NULL,' +
        'KLADR_DOM_ID_REGIONS    D_SMALLINT,' +
        'KLADR_DOM_ADDRESS_CODE  D_ID_MAIN,' +
        'KLADR_DOM_NAME          D_NAME,' +
        'KLADR_DOM_ABBREV_LEVEL  D_SMALLINT,' +
        'KLADR_DOM_ID_ABBREV     D_SMALLINT,');
    qryWrite.SQL.Append(
        'KLADR_DOM_UNO           D_SMALLINT DEFAULT 0,' +
        'KLADR_DOM_GNINMB        D_SMALLINT DEFAULT 0,' +
        'KLADR_DOM_INDEX         D_INTEGER ,' +
        'KLADR_DOM_OCATO0        D_INTEGER ,' +
        'KLADR_DOM_OCATO1        D_INTEGER ,' +
        'KLADR_DOM_OCATO2        D_INTEGER ,' +
        'KLADR_DOM_OCATO3        D_INTEGER);');

    qryWrite.ExecQuery;

    qryWrite.SQL.Clear;
    qryWrite.SQL.Append('insert into KLADR_DOM_NEW (KLADR_DOM_ID_REGIONS, KLADR_DOM_ADDRESS_CODE, KLADR_DOM_NAME,KLADR_DOM_ABBREV_LEVEL, KLADR_DOM_ID_ABBREV, KLADR_DOM_UNO,KLADR_DOM_GNINMB, KLADR_DOM_INDEX, KLADR_DOM_OCATO0,KLADR_DOM_OCATO1, KLADR_DOM_OCATO2, KLADR_DOM_OCATO3)' );
    qryWrite.SQL.Append('values (1,  10000000, ''двлд45,двлд43,двлд41,двлд39,двлд37'', 6, 1, 0, 105, 385000, 79, 401, 0, 0)');
    qryWrite.ExecQuery;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
---------------------------
Debugger Exception Notification
---------------------------
Project netdbs_2010.exe raised exception class EFIBInterBaseError with message 'fmMain.fmKLADRImport.qryWrite:
Can't format message 13:796 -- message file D:\Proj\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -204.
Table unknown.
KLADR_DOM_NEW.
At line 1, column 13.
'.
---------------------------
Break   Continue   Help   
---------------------------
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861527
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

после create table надо commit транзакции сделать. иначе ее до этого момента нет, и вставлять данные некуда.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861529
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,
комита нет

зы.
создай один раз таблицу и используй её когда надо

ззы. работа с GTT ничем не отличается от работы с обыкновенными таблицами
есть только один нюанс: данные "исчезают" либо по завершению транзакции,
либо по завершению коннекта
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861530
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

блин на кой чёрт тебе создвать таблицу из программы. Создай её 1 раз в IBE, да и индексы сразу. Структура КЛАДРА так часто не меняется.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861533
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby
Код: pascal
1.
2.
3.
4.
    qryWrite.SQL.Clear;
    qryWrite.SQL.Append('insert into KLADR_DOM_NEW (KLADR_DOM_ID_REGIONS, KLADR_DOM_ADDRESS_CODE, KLADR_DOM_NAME,KLADR_DOM_ABBREV_LEVEL, KLADR_DOM_ID_ABBREV, KLADR_DOM_UNO,KLADR_DOM_GNINMB, KLADR_DOM_INDEX, KLADR_DOM_OCATO0,KLADR_DOM_OCATO1, KLADR_DOM_OCATO2, KLADR_DOM_OCATO3)' );
    qryWrite.SQL.Append('values (1,  10000000, ''двлд45,двлд43,двлд41,двлд39,двлд37'', 6, 1, 0, 105, 385000, 79, 401, 0, 0)');
   qryWrite.ExecQuery;




Этак у тебя импорт данных долго проходить будет. Используй параметры.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861535
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

блин на кой чёрт тебе создвать таблицу из программы. Создай её 1 раз в IBE, да и индексы сразу. Структура КЛАДРА так часто не меняется.

Ну сами же сказали что надо ее создать в одной транзакции, и никто не заметит, что она была )
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861538
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby
Код: pascal
1.
2.
3.
4.
    qryWrite.SQL.Clear;
    qryWrite.SQL.Append('insert into KLADR_DOM_NEW (KLADR_DOM_ID_REGIONS, KLADR_DOM_ADDRESS_CODE, KLADR_DOM_NAME,KLADR_DOM_ABBREV_LEVEL, KLADR_DOM_ID_ABBREV, KLADR_DOM_UNO,KLADR_DOM_GNINMB, KLADR_DOM_INDEX, KLADR_DOM_OCATO0,KLADR_DOM_OCATO1, KLADR_DOM_OCATO2, KLADR_DOM_OCATO3)' );
    qryWrite.SQL.Append('values (1,  10000000, ''двлд45,двлд43,двлд41,двлд39,двлд37'', 6, 1, 0, 105, 385000, 79, 401, 0, 0)');
   qryWrite.ExecQuery;




Этак у тебя импорт данных долго проходить будет. Используй параметры.

Какие еще параметры? Наоборот я сразу уже пишу, а так еще параметры будут присваиваться
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861546
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mlaby,
комита нет

зы.
создай один раз таблицу и используй её когда надо

ззы. работа с GTT ничем не отличается от работы с обыкновенными таблицами
есть только один нюанс: данные "исчезают" либо по завершению транзакции,
либо по завершению коннекта

Тогда это не временная таблица, а таблица с временными данными, типа я идиот не знаю конструкции delete from
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861547
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby> Какие еще параметры? Наоборот я сразу уже пишу, а так еще параметры будут присваиваться


--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861552
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

похоже ты не понял что такое GTT. Это такая же постоянная структура с точки зрения метаданных, только сами данные в ней временные. Поэтому не надо каждый раз её создавать и грохать.

Про параметры ты не прав. Разница будет в разы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
qryWrite.SQL.Clear;
qryWrite.SQL.Append('insert into KLADR_DOM_NEW (KLADR_DOM_ID_REGIONS, KLADR_DOM_ADDRESS_CODE, KLADR_DOM_NAME,KLADR_DOM_ABBREV_LEVEL, KLADR_DOM_ID_ABBREV, KLADR_DOM_UNO,KLADR_DOM_GNINMB, KLADR_DOM_INDEX, KLADR_DOM_OCATO0,KLADR_DOM_OCATO1, KLADR_DOM_OCATO2, KLADR_DOM_OCATO3)' );
qryWrite.SQL.Append('values (:KLADR_DOM_ID_REGIONS, :KLADR_DOM_ADDRESS_CODE, :KLADR_DOM_NAME, :KLADR_DOM_ABBREV_LEVEL, :KLADR_DOM_ID_ABBREV, :KLADR_DOM_UNO, :KLADR_DOM_GNINMB, :KLADR_DOM_INDEX, :KLADR_DOM_OCATO0, :KLADR_DOM_OCATO1, :KLADR_DOM_OCATO2, :KLADR_DOM_OCATO3)');
qryWrite.Prepare;
dbfTable.Open;
while not dbfTable.Eof do
begin
  qryWrite.ParamByName('KLADR_DOM_ID_REGIONS').AsInteger := dbfTable.FieldByName('KLADR_DOM_ID_REGIONS').AsInteger;
....
  qryWrite.ExecQuery;
  dbfTable.Next;
end;
dbfTable.Close;



если использовать неименованные параметры будет ещё быстрее
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861555
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

похоже ты не понял что такое GTT. Это такая же постоянная структура с точки зрения метаданных, только сами данные в ней временные. Поэтому не надо каждый раз её создавать и грохать.

Про параметры ты не прав. Разница будет в разы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
qryWrite.SQL.Clear;
qryWrite.SQL.Append('insert into KLADR_DOM_NEW (KLADR_DOM_ID_REGIONS, KLADR_DOM_ADDRESS_CODE, KLADR_DOM_NAME,KLADR_DOM_ABBREV_LEVEL, KLADR_DOM_ID_ABBREV, KLADR_DOM_UNO,KLADR_DOM_GNINMB, KLADR_DOM_INDEX, KLADR_DOM_OCATO0,KLADR_DOM_OCATO1, KLADR_DOM_OCATO2, KLADR_DOM_OCATO3)' );
qryWrite.SQL.Append('values (:KLADR_DOM_ID_REGIONS, :KLADR_DOM_ADDRESS_CODE, :KLADR_DOM_NAME, :KLADR_DOM_ABBREV_LEVEL, :KLADR_DOM_ID_ABBREV, :KLADR_DOM_UNO, :KLADR_DOM_GNINMB, :KLADR_DOM_INDEX, :KLADR_DOM_OCATO0, :KLADR_DOM_OCATO1, :KLADR_DOM_OCATO2, :KLADR_DOM_OCATO3)');
qryWrite.Prepare;
dbfTable.Open;
while not dbfTable.Eof do
begin
  qryWrite.ParamByName('KLADR_DOM_ID_REGIONS').AsInteger := dbfTable.FieldByName('KLADR_DOM_ID_REGIONS').AsInteger;
....
  qryWrite.ExecQuery;
  dbfTable.Next;
end;
dbfTable.Close;



если использовать неименованные параметры будет ещё быстрее

За счет чего будет разница??? Разве не sql-запрос будет выполняться на сервере который я написал, будет нечто волшебное - параметры гурьбой полетят на сервер?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861559
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

FB все запросы выполняет в два этапа. Сначала поисходит подготовка запроса (prepare) в это время разбирается текст запроса парсером и он преобразуется в BLR, оптимизатор вычисляет план, может ещё чего то делается. Потом собствено выполнение запроса. Если у тебя запрос без параметров, то обе фазы происходят на каждую запись. В случае параметризованаого запроса, подготовка запроса выполняется всего один раз.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861563
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или вы хотите сказать, что 4 миллииона qryWrite.SQL.Append долго выполняются??? Да 10 секунд!
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861569
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

FB все запросы выполняет в два этапа. Сначала поисходит подготовка запроса (prepare) в это время разбирается текст запроса парсером и он преобразуется в BLR, оптимизатор вычисляет план, может ещё чего то делается. Потом собствено выполнение запроса. Если у тебя запрос без параметров, то обе фазы происходят на каждую запись. В случае параметризованаого запроса, подготовка запроса выполняется всего один раз.

Ну не знаю, когда я делал update or insert через параметры циклом выполнялось в 2 раза дольше, чем сразу огромный текст подготовил и скриптом выполнил без всяких параметров ...
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861573
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

значит ты что то не правильно делал. Скорее всего у тебя сама подготовка запроса каждый раз в цикле была, а не вынесена за пределы цикла
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861577
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby> Ну не знаю, когда я делал update or insert через параметры циклом выполнялось в 2 раза дольше, чем сразу огромный текст подготовил и скриптом выполнил без всяких параметров ...
Блин, да поверь ты взрослым дядям!!! Плохого не посоветуют!!!


--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861585
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zirra Блин, да поверь ты взрослым дядям!!! Плохого не посоветуют!!!

--
Vladimir A.Bakhvaloff

Верю, но я тоже не молод уже ...
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861591
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby> Верю, но я тоже не молод уже ...
Я не про возраст, а про ОПЫТ...
....
Я сам долго упирался против этого метода...
А потом послушался и сделал такой "вставлятель", что он и isql уделывал...

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861899
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Умные дядьки, посмотрите маржу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
MERGE INTO KLADR_DOM T
USING (SELECT * from KLADR_DOM_NEW N
       WHERE NOT EXISTS(SELECT
                            D.id_kladr_dom
                        FROM
                            KLADR_DOM D
                        WHERE
                            N.KLADR_DOM_ID_REGIONS=D.KLADR_DOM_ID_REGIONS and
                            N.KLADR_DOM_ADDRESS_CODE=D.KLADR_DOM_ADDRESS_CODE and
                            N.KLADR_DOM_NAME=D.kladr_dom_name and
                            N.KLADR_DOM_ABBREV_LEVEL=D.KLADR_DOM_ABBREV_LEVEL and
                            N.KLADR_DOM_ID_ABBREV=D.KLADR_DOM_ID_ABBREV and
                            N.KLADR_DOM_UNO=D.KLADR_DOM_UNO and
                            N.KLADR_DOM_GNINMB=D.KLADR_DOM_GNINMB and
                            N.KLADR_DOM_INDEX=D.KLADR_DOM_INDEX and
                            N.KLADR_DOM_OCATO0=D.KLADR_DOM_OCATO0 and
                            N.KLADR_DOM_OCATO1=D.KLADR_DOM_OCATO1 and
                            N.KLADR_DOM_OCATO2=D.KLADR_DOM_OCATO2 and
                            N.KLADR_DOM_OCATO3=D.KLADR_DOM_OCATO3)) SRC

       ON    T.KLADR_DOM_ID_REGIONS = SRC.KLADR_DOM_ID_REGIONS
         AND T.KLADR_DOM_ADDRESS_CODE = SRC.KLADR_DOM_ADDRESS_CODE
         AND T.KLADR_DOM_NAME = SRC.KLADR_DOM_NAME

       WHEN MATCHED THEN

       UPDATE SET
         KLADR_DOM_ABBREV_LEVEL=SRC.KLADR_DOM_ABBREV_LEVEL,
         KLADR_DOM_ID_ABBREV=SRC.KLADR_DOM_ID_ABBREV,
         KLADR_DOM_UNO=SRC.KLADR_DOM_UNO,
         KLADR_DOM_GNINMB=SRC.KLADR_DOM_GNINMB,
         KLADR_DOM_INDEX=SRC.KLADR_DOM_INDEX,
         KLADR_DOM_OCATO0=SRC.KLADR_DOM_OCATO0,
         KLADR_DOM_OCATO1=SRC.KLADR_DOM_OCATO1,
         KLADR_DOM_OCATO2=SRC.KLADR_DOM_OCATO2,
         KLADR_DOM_OCATO3=SRC.KLADR_DOM_OCATO3

      WHEN NOT MATCHED THEN

      INSERT ( KLADR_DOM_ID_REGIONS, KLADR_DOM_ADDRESS_CODE, KLADR_DOM_NAME,KLADR_DOM_ABBREV_LEVEL, KLADR_DOM_ID_ABBREV,
               KLADR_DOM_UNO, KLADR_DOM_GNINMB, KLADR_DOM_INDEX, KLADR_DOM_OCATO0, KLADR_DOM_OCATO1, KLADR_DOM_OCATO2, KLADR_DOM_OCATO3)
      VALUES (SRC.KLADR_DOM_ID_REGIONS, SRC.KLADR_DOM_ADDRESS_CODE, SRC.KLADR_DOM_NAME, SRC.KLADR_DOM_ABBREV_LEVEL, SRC.KLADR_DOM_ID_ABBREV,
              SRC.KLADR_DOM_UNO, SRC.KLADR_DOM_GNINMB, SRC.KLADR_DOM_INDEX, SRC.KLADR_DOM_OCATO0, SRC.KLADR_DOM_OCATO1, SRC.KLADR_DOM_OCATO2,
              SRC.KLADR_DOM_OCATO3);
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861910
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

да вроде всё пучком
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861960
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему-то merge почти все записи проапдейтил
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861962
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labyПочему-то merge почти все записи проапдейтил

но не за 3 часа как раньше а за 10 минут
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38861964
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

у тебя там NULLы в полях есть?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38862951
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

у тебя там NULLы в полях есть?

Вроде нет.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866370
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labyСимонов Денисlaby,

у тебя там NULLы в полях есть?

Вроде нет.

Да, было там одно поле не присвоено.

Сейчас вроде мерже работает.
Но нарисовалась проблема что в прошлом разу было мало записей теперь много, так что от мержи толку мало.
Но я уже придумал решение - буду инсертить-мержить по частям через время.
А вот по окончании старые удалить - заинсерчу снова во временную теперь все записи и удалю в замерженном те, которых нет в ГТТ.

Есть желание для этого ХП сделать. Но по ГТТ я чтото читал типа в ХП чего-то там нельзя.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866385
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

всё там можно. ХП - самое правильное решение. Ведь операция то не одноразовая. Самое главное сделать ХП надо не селективной, т.е . SUPEND там быть не должно. Естественно GTT заполнить до вызова ХП, обычными insert'ами, а затем в той же транзакции вызвать ХП которая раскидает записи из GTT нужным образом.
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866707
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А после update можно как-то узнать сколько записей проапдейтилось,
кроме как по триггеру время проставлять в записях, а потом запрос по времени?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866713
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
labyА после update можно как-то узнать сколько записей проапдейтилось,
кроме как по триггеру время проставлять в записях, а потом запрос по времени?
Точнее говоря после merge сколько добавлено и обновлено, или до мерже их тупо вычислить
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866735
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
laby,

c merge тут будет облом http://www.sql.ru/forum/1090896/row-count-chto-dolzhno-v-nyom-byt-v-rezultate-merge?hl=row_count merge

Придётся либо отказываться от MERGE и обновлять/добавлять записи в цикле по курсору, либо отказаться от этой информации вовсе.
Можно через триггер попробовать такой счётчик сделать, но ИХМО это криво
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866746
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисc merge тут будет облом
Не будет. isc_dsql_sql_info() возвращает раздельные счётчики по каждой операции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866752
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

1. Я сомневаюсь что ТС сможет ей воспользоваться
2. Эта информация скорее всего важна ему внутри ХП
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38866799
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. Я сомневаюсь что ТС сможет ей воспользоваться
2. Эта информация скорее всего важна ему внутри ХП
1. Ограниченные возможности ТС-а это не наша проблема.
2. Маниакальное желание абсолютно всё делать в ХП к добру не приводит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38868060
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovСимонов Денисc merge тут будет облом
Не будет. isc_dsql_sql_info() возвращает раздельные счётчики по каждой операции.


Да, я всё решил без ХП:

1) Делаю GTT;
2) Добавляю записи (первые 30000 записей):
Код: sql
1.
2.
3.
4.
5.
insert into KLADR_ADDRESS_NEW (KLADR_ADDRESS_CODE, KLADR_ADDRESS_ID_REGIONS, KLADR_ADDRESS_PAR,
                               KLADR_ADDRESS_NAME, KLADR_ADDRESS_ABBREV_LEVEL, KLADR_ADDRESS_ID_ABBREV,
                               KLADR_ADDRESS_UNO, KLADR_ADDRESS_GNINMB, KLADR_ADDRESS_STATUS, KLADR_ADDRESS_INDEX,
                               KLADR_ADDRESS_OCATO0, KLADR_ADDRESS_OCATO1, KLADR_ADDRESS_OCATO2, KLADR_ADDRESS_OCATO3)
values (:reg, :id, :pro, :nam, :lvl, cods, :uno, :gnimb, :stat, :indx, :OC0, :OC1, :OC2, :OC3)



3) Подсчитываю сколько новых записей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT count(*) ch_cnt from KLADR_ADDRESS_NEW N
       WHERE NOT EXISTS(SELECT
                            A.id_kladr_address
                        FROM
                            KLADR_ADDRESS A
                        WHERE
                         A.KLADR_ADDRESS_ID_REGIONS=N.KLADR_ADDRESS_ID_REGIONS and
                         A.KLADR_ADDRESS_CODE=N.KLADR_ADDRESS_CODE and
                         A.KLADR_ADDRESS_PAR=N.KLADR_ADDRESS_PAR and
                         A.KLADR_ADDRESS_NAME=N.KLADR_ADDRESS_NAME and
                         A.KLADR_ADDRESS_ABBREV_LEVEL=N.KLADR_ADDRESS_ABBREV_LEVEL and
                         A.KLADR_ADDRESS_ID_ABBREV=N.KLADR_ADDRESS_ID_ABBREV and
                         A.KLADR_ADDRESS_UNO=N.KLADR_ADDRESS_UNO and
                         A.KLADR_ADDRESS_GNINMB=N.KLADR_ADDRESS_GNINMB and
                         A.KLADR_ADDRESS_STATUS=N.KLADR_ADDRESS_STATUS and
                         A.KLADR_ADDRESS_INDEX=N.KLADR_ADDRESS_INDEX and
                         A.KLADR_ADDRESS_OCATO0=N.KLADR_ADDRESS_OCATO0 and
                         A.KLADR_ADDRESS_OCATO1=N.KLADR_ADDRESS_OCATO1 and
                         A.KLADR_ADDRESS_OCATO2=N.KLADR_ADDRESS_OCATO2 and
                         A.KLADR_ADDRESS_OCATO3=N.KLADR_ADDRESS_OCATO3 and
                         A.kladr_address_del=0)



4) сливаю новые с существующими
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
MERGE INTO KLADR_ADDRESS T
USING (SELECT * from KLADR_ADDRESS_NEW N
       WHERE NOT EXISTS(SELECT
                            A.id_kladr_address
                        FROM
                            KLADR_ADDRESS A
                        WHERE
                         A.KLADR_ADDRESS_ID_REGIONS=N.KLADR_ADDRESS_ID_REGIONS and
                         A.KLADR_ADDRESS_CODE=N.KLADR_ADDRESS_CODE and
                         A.KLADR_ADDRESS_PAR=N.KLADR_ADDRESS_PAR and
                         A.KLADR_ADDRESS_NAME=N.KLADR_ADDRESS_NAME and
                         A.KLADR_ADDRESS_ABBREV_LEVEL=N.KLADR_ADDRESS_ABBREV_LEVEL and
                         A.KLADR_ADDRESS_ID_ABBREV=N.KLADR_ADDRESS_ID_ABBREV and
                         A.KLADR_ADDRESS_UNO=N.KLADR_ADDRESS_UNO and
                         A.KLADR_ADDRESS_GNINMB=N.KLADR_ADDRESS_GNINMB and
                         A.KLADR_ADDRESS_STATUS=N.KLADR_ADDRESS_STATUS and
                         A.KLADR_ADDRESS_INDEX=N.KLADR_ADDRESS_INDEX and
                         A.KLADR_ADDRESS_OCATO0=N.KLADR_ADDRESS_OCATO0 and
                         A.KLADR_ADDRESS_OCATO1=N.KLADR_ADDRESS_OCATO1 and
                         A.KLADR_ADDRESS_OCATO2=N.KLADR_ADDRESS_OCATO2 and
                         A.KLADR_ADDRESS_OCATO3=N.KLADR_ADDRESS_OCATO3 and
                         A.kladr_address_del=0)) SRC
ON T.KLADR_ADDRESS_ID_REGIONS = SRC.KLADR_ADDRESS_ID_REGIONS
   AND T.KLADR_ADDRESS_CODE = SRC.KLADR_ADDRESS_CODE
WHEN MATCHED THEN
    UPDATE SET
                         KLADR_ADDRESS_PAR=SRC.KLADR_ADDRESS_PAR,
                         KLADR_ADDRESS_NAME=SRC.KLADR_ADDRESS_NAME,
                         KLADR_ADDRESS_ABBREV_LEVEL=SRC.KLADR_ADDRESS_ABBREV_LEVEL,
                         KLADR_ADDRESS_ID_ABBREV=SRC.KLADR_ADDRESS_ID_ABBREV,
                         KLADR_ADDRESS_UNO=SRC.KLADR_ADDRESS_UNO,
                         KLADR_ADDRESS_GNINMB=SRC.KLADR_ADDRESS_GNINMB,
                         KLADR_ADDRESS_STATUS=SRC.KLADR_ADDRESS_STATUS,
                         KLADR_ADDRESS_INDEX=SRC.KLADR_ADDRESS_INDEX,
                         KLADR_ADDRESS_OCATO0=SRC.KLADR_ADDRESS_OCATO0,
                         KLADR_ADDRESS_OCATO1=SRC.KLADR_ADDRESS_OCATO1,
                         KLADR_ADDRESS_OCATO2=SRC.KLADR_ADDRESS_OCATO2,
                         KLADR_ADDRESS_OCATO3=SRC.KLADR_ADDRESS_OCATO3
WHEN NOT MATCHED THEN
insert ( KLADR_ADDRESS_ID_REGIONS,  KLADR_ADDRESS_CODE,  KLADR_ADDRESS_PAR,  KLADR_ADDRESS_NAME,  KLADR_ADDRESS_ABBREV_LEVEL,
         KLADR_ADDRESS_ID_ABBREV,   KLADR_ADDRESS_UNO,  KLADR_ADDRESS_GNINMB,  KLADR_ADDRESS_STATUS,  KLADR_ADDRESS_INDEX,
         KLADR_ADDRESS_OCATO0,  KLADR_ADDRESS_OCATO1,  KLADR_ADDRESS_OCATO2,  KLADR_ADDRESS_OCATO3)
values (SRC.KLADR_ADDRESS_ID_REGIONS, SRC.KLADR_ADDRESS_CODE, SRC.KLADR_ADDRESS_PAR, SRC.KLADR_ADDRESS_NAME, SRC.KLADR_ADDRESS_ABBREV_LEVEL,
        SRC.KLADR_ADDRESS_ID_ABBREV,  SRC.KLADR_ADDRESS_UNO, SRC.KLADR_ADDRESS_GNINMB, SRC.KLADR_ADDRESS_STATUS, SRC.KLADR_ADDRESS_INDEX,
        SRC.KLADR_ADDRESS_OCATO0, SRC.KLADR_ADDRESS_OCATO1, SRC.KLADR_ADDRESS_OCATO2, SRC.KLADR_ADDRESS_OCATO3);



5. Если записей мало новых ch_cnt (вычисленных в п. 3), - то берем следующие 30000-ch_cnt и так далее пока не обновим 29000+ записей

6. Через пол часа повторяем процедуру (пп. 2-5) и так далее пока не пройдем всю исходную таблицу (кладр)

6. Добавляем весь кладр в GTT

7. Удаляю все записи, которых нет в GTT
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38883257
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovСимонов Денисc merge тут будет облом
Не будет. isc_dsql_sql_info() возвращает раздельные счётчики по каждой операции.


Можно поподробнее?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38883258
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисDimitry Sibiryakov,

1. Я сомневаюсь что ТС сможет ей воспользоваться
2. Эта информация скорее всего важна ему внутри ХП

Почему?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38883259
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисlaby,

c merge тут будет облом http://www.sql.ru/forum/1090896/row-count-chto-dolzhno-v-nyom-byt-v-rezultate-merge?hl=row_count merge

Придётся либо отказываться от MERGE и обновлять/добавлять записи в цикле по курсору, либо отказаться от этой информации вовсе.
Можно через триггер попробовать такой счётчик сделать, но ИХМО это криво

Так всё-таки могу или нет?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38883266
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyТак всё-таки могу или нет?
Ох, нам-то откуда знать хватает у тебя мозгов на использование Firebird API или нет?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38883590
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovlabyТак всё-таки могу или нет?
Ох, нам-то откуда знать хватает у тебя мозгов на использование Firebird API или нет?..


А это чего такое?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38883637
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labyDimitry Sibiryakovпропущено...

Ох, нам-то откуда знать хватает у тебя мозгов на использование Firebird API или нет?..


А это чего такое?

Ну где-то здесь ответ
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38888055
laby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mlabyпропущено...


А это чего такое?

Ну где-то здесь ответ

А по-русски?
...
Рейтинг: 0 / 0
Скрипт update or insert по изменению только
    #38888104
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labym7mпропущено...


Ну где-то здесь ответ

А по-русски?
Не знаю, для моих задач достаточно стандартных оберток.
Посмотри примеры использования API (они в папке ..\examples\api\), правда тоже не на русском

ps. IB/FB API смотрел немного еще во времена IB 6, но только для общего развития
использовал API очень давно (лет этак 25 назад) но то был совсем не IB
...
Рейтинг: 0 / 0
102 сообщений из 102, показаны все 5 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Скрипт update or insert по изменению только
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]