Мой первый цикл for в SQL - PullRequest
0 голосов
/ 28 мая 2018
/*alter table schematics
add type_id NUMBER;*/

begin

for i in  (
select a.id,
       substr(a.key,
              instr(a.key, '|') + 1,
              (instr(a.key, '|', 1, 2) -
              (instr(a.key, '|', 1, 1) + 1))) TYPE_ID
  from schematics a)
  loop 
    update schematics
    set type_id = TYPE_ID;
  end loop;
)
end

Эй, ребята, вы можете мне помочь?TYPE_ID дает мне кучу идентификаторов, и я хочу сохранить их во вновь созданном столбце, используя цикл for. В первый раз, используя for в sql, не знаю, как это сделать.Любая помощь?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы пытаетесь обновить только что созданный столбец значением, рассчитанным из другого столбца.Обычно это делается с помощью простого обновления:

update schematics
set type_id = 
  substr(key,
         instr(key, '|') + 1, 
         instr(key, '|', 1, 2) - instr(key, '|', 1, 1) - 1);

Если вы хотите сделать то же самое в PL / SQL с циклом для каждой отдельной записи, вы должны выбрать ключ и вычисленное значение, чтобы использовать обадля обновления.Но это похоже на излишество.

begin
  for rec in
  (
    select distinct 
      key,
      substr(key,
             instr(key, '|') + 1, 
             instr(key, '|', 1, 2) - instr(key, '|', 1, 1) - 1) as type_id
    from schematics
  ) loop 
    update schematics
    set type_id = rec.type_id
    where key = rec.key;
  end loop;
end;
0 голосов
/ 28 мая 2018

Вам не нужен цикл for.Более того, в чистом SQL нет циклов ... Просто потому, что они обычно вам не нужны.В процедурных расширениях, таких как PL / SQL (Oracle) или T / SQL (сервер SQL), есть циклы, но они действительно не решают вашу проблему.

Просто используйте простое update

update schematics set type_id = substr(akey,
              instr(key, '|') + 1,
              (instr(key, '|', 1, 2) -
              (instr(key, '|', 1, 1) + 1)))

(возможно, позже может потребоваться условие where)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...