powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Скрипт update or insert по изменению только
25 сообщений из 102, страница 4 из 5
Скрипт 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
25 сообщений из 102, страница 4 из 5
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Скрипт update or insert по изменению только
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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