powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите
9 сообщений из 9, страница 1 из 1
Подскажите
    #38912042
raziel.kdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Подскажите пожалуйста как реализовать такое?

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

Сейчас я пытаюсь это сделать таким образом:

Код: 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.
execute block
as
/* куча переменных в которые сохраняю выводы селектов*/
declare variable USL FDB$INT;
/* тут я нахожу старый ид, пока по одному клиенту*/
begin
  for select distinct CUSTOMERUTILITIES.ID
      from CUSTOMERUTILITIES
      join CUSTOMERUTILITIES_HISTORY on CUSTOMERUTILITIES.ID = CUSTOMERUTILITIES_HISTORY.CUSTOMERUTILITIES_ID
      where CUSTOMERUTILITIES_HISTORY.SERVICEPROVIDER_ID = 3 and
            CUSTOMERUTILITIES_HISTORY.IS_DISABLED = 0 and
            CUSTOMERUTILITIES.CUSTOMER_ID = 1030211
      into :OLD_CUSTOMERUTILITIES_ID

/* выбираю записи по старому ид, смотрю значение генератора, записываю его, потом вставляю записи(в триггере BI значение генератора увеличивается на один, если его не подаём, что я и делаю в инсерте.)*/
 do
  begin
    select CUSTOMERUTILITIES.CUSTOMER_ID, CUSTOMERUTILITIES.PUBLICUTILITIES_ID,
           CUSTOMERUTILITIES.DEPENDS_ON_CUSTOMERUTILITIES_ID
    from CUSTOMERUTILITIES
    where CUSTOMERUTILITIES.ID = :OLD_CUSTOMERUTILITIES_ID
    into :CLIENT_ID, :USL, :ZAVISIT;

    select gen_id(CUSTOMERUTILITIES_ID_GEN, 0)
    from RDB$DATABASE
    into :NEW_CUSTOMERUTILITIES_ID;

    insert into CUSTOMERUTILITIES (CUSTOMERUTILITIES.SUPPLIER_ID, CUSTOMERUTILITIES.CUSTOMER_ID,
                                   CUSTOMERUTILITIES.PUBLICUTILITIES_ID,
                                   CUSTOMERUTILITIES.DEPENDS_ON_CUSTOMERUTILITIES_ID)
    values (4, :CLIENT_ID, :USL, :ZAVISIT);

/* Дальше мне нужно найти записи со старым ИД и скопировать их в таблицу с новым ИД, но т.к. запись не появляется в бд до коммита, то мне выдаёт что нет такой записи с ид которой ты пытаешься вставить. вот.*/
begin
      for select ...
          from CUSTOMERUTILITIES_HISTORY
          where CUSTOMERUTILITIES_HISTORY.CUSTOMERUTILITIES_ID = :OLD_CUSTOMERUTILITIES_ID
          into :START_PERIOD_USL, :END_PERIOD_USL, :NORMA

      do
      begin
        insert into CUSTOMERUTILITIES_HISTORY (CUSTOMERUTILITIES_HISTORY.CUSTOMERUTILITIES_ID)
        values (:NEW_CUSTOMERUTILITIES_ID);



Подскажите как мне комитить в блоке?
У меня мозгов не хватает.
Пробовал после инсерт end; commit; выдаёт про token unknown.
Дайте пинка в верном направлении, пожалуйста)
...
Рейтинг: 0 / 0
Подскажите
    #38912044
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raziel.kdmСейчас я пытаюсь это сделать таким образом:
Бред ты пытаешься сделать какой-то.
Код: sql
1.
2.
3.
4.
5.
6.
7.
declare new_id integer;
for select a,b,c,d from t into :a, :b, :c, :d do
begin
  new_id = sequence.next_value;
  insert into t (a,b,c,d) values (:new_id, :b, :c, :d);
  insert into t2 (a,e,f) select :new_id,e,f from t2 where a=:a;
end


Всё, телемаркет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите
    #38912063
raziel.kdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Я использую ибексперт, он мне вот такое выдаёт
can't format message 13:896 -- message system code -4. Dynamic SQL Error. SQL error code = -104.
Token unknown - line 1, column 9. old_customerutilities_id.

и потом сразу

can't format message 13:896 -- message system code -4. Dynamic SQL Error. SQL error code = -104.
Token unknown - line 1, column 1. for.

Сам код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare old_customerutilities_id integer;

for select
a.z
from a
join b on a.z = b.z
where b.y = x
into :old_customerutilities_id
begin
end
...
Рейтинг: 0 / 0
Подскажите
    #38912068
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raziel.kdm,

commit нельзя делать внутри EB и точка.
...
Рейтинг: 0 / 0
Подскажите
    #38912073
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raziel.kdmСам код:
А где собственно слова EXECUTE BLOCK? Или ты думал, что я тебе натыкал что-то готовое к
копипасту?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите
    #38912117
raziel.kdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, я пробовал и с execute block вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
execute block as
declare old_customerutilities_id integer;
for select customerutilities.id from customerutilities into :old_customerutilities_id
do
begin
suspend;
end


Результат-то тот же
Token unknown - line 7, column 1. for.
...
Рейтинг: 0 / 0
Подскажите
    #38912120
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raziel.kdm,

ты издеваешься что ли? А begin/end обрамляющий PSQL часть блока кто будет писать?
...
Рейтинг: 0 / 0
Подскажите
    #38912188
raziel.kdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь. С синтаксисом у меня плохо. Заработало, после ваших подсказок)
Дмитрию Сибирякову огромное спасибо.
...
Рейтинг: 0 / 0
Подскажите
    #38912932
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raziel.kdm,

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

Код: sql
1.
2.
3.
from CUSTOMERUTILITIES
      join CUSTOMERUTILITIES_HISTORY on CUSTOMERUTILITIES.ID = CUSTOMERUTILITIES_HISTORY.CUSTOMERUTILITIES_ID
      where CUSTOMERUTILITIES_HISTORY.SERVICEPROVIDER_ID = 3 and



разве так не проще?
Код: sql
1.
2.
3.
from CUSTOMERUTILITIES CU
      join CUSTOMERUTILITIES_HISTORY CH on CU.ID = CH.CUSTOMERUTILITIES_ID
      where CH.SERVICEPROVIDER_ID = 3 and



p.s. я так понимаю, запрос из "построителя запросов". но там все равно можно алиасы таблицам давать.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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