我在SQL中的第一个for循环

时间:2018-05-27 21:40:17

标签: sql oracle loops for-loop plsql

/*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给了我一堆ID,我希望使用for循环将它们存储在我新创建的列中。第一次使用for in sql,不知道怎么做。 有帮助吗? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

您正尝试使用从其他列计算的值更新新创建的列。这通常只需更新即可完成:

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;

答案 1 :(得分:0)

您不需要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条款)