我在SQL中的第一个for循环

我在SQL中的第一个for循环,sql,oracle,loops,for-loop,plsql,Sql,Oracle,Loops,For Loop,Plsql,嘿,伙计们,你们能帮我吗? TYPE_ID为我提供了一组ID,我想使用for循环将它们存储在新创建的列中。第一次在sql中使用for时,我不知道怎么做。 有什么帮助吗? 提前感谢。您不需要for循环。此外,纯SQL中没有循环。。。只是因为你通常不需要它们。在PL/SQL(Oracle)或T/SQL(SQL server)等过程扩展中存在循环,但它们确实不能解决您的问题 只需使用一个简单的更新 /*alter table schematics add type_id NUMBER;*/ begi

嘿,伙计们,你们能帮我吗? TYPE_ID为我提供了一组ID,我想使用for循环将它们存储在新创建的列中。第一次在sql中使用for时,我不知道怎么做。 有什么帮助吗?
提前感谢。

您不需要for循环。此外,纯SQL中没有循环。。。只是因为你通常不需要它们。在PL/SQL(Oracle)或T/SQL(SQL server)等过程扩展中存在循环,但它们确实不能解决您的问题

只需使用一个简单的
更新

/*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

(以后可能需要一个
where
子句)

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

update schematics set type_id = substr(akey,
              instr(key, '|') + 1,
              (instr(key, '|', 1, 2) -
              (instr(key, '|', 1, 1) + 1)))
如果您想在PL/SQL中对每个记录执行相同的循环,那么您需要选择键和计算值,以便在更新中同时使用。但这似乎太过分了

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

SQL中没有for循环。只有在过程扩展中,某些DBMS才可能提供循环。但这些语言各不相同。因此,有必要了解您使用的数据库管理系统,以帮助您。请编辑问题并在标签中包含您正在使用的DBMS。而且你很可能不需要一个循环。看起来这也可以通过set操作来完成。(而且在
更新
中没有
WHERE
子句,也就是说,每一行都被更新了。这是故意的吗?)那就是Oracle。你确定吗?谷歌搜索“SQLforLoop”确实显示了结果和示例!是的,我肯定。结果适用于我提到的各种程序扩展。对于Oracle来说,它是PL/SQL。Oracle/PLSQL中的For循环就是我一直试图实际使用的示例,到目前为止还没有成功。您的循环在语法上似乎还可以。但是你不能在身体里使用
i
。在这种循环中,
i
将是一条记录,其中包含查询结果中的一行。这不是一个数字,正如你的名字所暗示的那样,你可能会相信它。仅更新一项就可以存储我在新列中找到的所有值吗?我觉得我需要一次创建一行作为(但那只是我,我对SQL:)我不太熟悉@PhilipBSS我不知道你的意思。无论如何,它不会创建新记录……正如
update
命令的名称所示。您应该在测试表上有限的一组行ar上测试它,以检查它是否符合您的要求。@PhilipBSS:如果类型id是一个
数字,您可能还需要一个
to_NUMBER()
。像我猜的
SET TYPE\u ID=TO\u NUMBER(SUBSTR…
),而不是
key
(它似乎编码了某种类型)
ID
可以用来识别行。@sticky bit:是的,我们可以,但是这个公式是根据
key
,使用它更有意义。但是,我的查询中有一个错误(我没有选择
),我添加了
distinct
,这样我就不会一次又一次地更新同一行。
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;