Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите / 9 сообщений из 9, страница 1 из 1
21.03.2015, 18:37
    #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
21.03.2015, 18:45
    #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
21.03.2015, 19:20
    #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
21.03.2015, 19:29
    #38912068
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите
raziel.kdm,

commit нельзя делать внутри EB и точка.
...
Рейтинг: 0 / 0
21.03.2015, 19:40
    #38912073
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите
raziel.kdmСам код:
А где собственно слова EXECUTE BLOCK? Или ты думал, что я тебе натыкал что-то готовое к
копипасту?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.03.2015, 21:17
    #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
21.03.2015, 21:28
    #38912120
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите
raziel.kdm,

ты издеваешься что ли? А begin/end обрамляющий PSQL часть блока кто будет писать?
...
Рейтинг: 0 / 0
22.03.2015, 01:33
    #38912188
raziel.kdm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите
Извиняюсь. С синтаксисом у меня плохо. Заработало, после ваших подсказок)
Дмитрию Сибирякову огромное спасибо.
...
Рейтинг: 0 / 0
23.03.2015, 11:05
    #38912932
kdv
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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