代码之家  ›  专栏  ›  技术社区  ›  Tim

在SQL Developer中使用游标为每条记录生成后续查询

  •  0
  • Tim  · 技术社区  · 1 年前

    我有一个SQL Developer查询,我想在其中使用光标来生成后续的select语句。

    但是,我做错了什么。我似乎没有正确使用光标。

    这是我迄今为止的代码。非常感谢。

    DECLARE
    
      numMaterials  NUMBER := 0;
    
      CURSOR item_id_cur
          IS
           select id from item_h
           where value = 'myvalue';
                     
        l_item_id   item_id_cur%ROWTYPE;
    BEGIN
    
      OPEN item_id_cur;
    
      LOOP
        FETCH item_id_cur INTO l_item_id;
        EXIT WHEN item_id_cur%NOTFOUND;
    
        SELECT count(*)
         INTO numMaterials
         FROM item_material_h
            WHERE fk_item = l_item_id;    --Does NOT like this line!!
        
        DBMS_OUTPUT.put_line (numMaterials);
       
      END LOOP; 
    END;
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Littlefoot    1 年前

    您必须引用特定的列,即。

    WHERE fk_item = l_item_id.id;   
    

    因为

    CURSOR item_id_cur IS select id from item_h
                                 --
                                 this
    

    或者,您可以声明

    l_item_id item_h.id%type;          --> note ".id%type"!
    

    然后像你已经做过的那样使用它:

    FETCH item_id_cur INTO l_item_id;
    (...)       
    
    WHERE fk_item = l_item_id;   
    

    别忘了 光标!


    您可能感兴趣的另一个选项是游标FOR循环,它比您使用的循环更简单,因为Oracle 许多的 取而代之的是:您不必显式声明游标(只需将select语句放入循环中)或游标变量,打开或关闭游标,也不必担心退出循环:

    declare
      numMaterials number;
    begin
      for item_id_cur in (select id from item_h where value = 'myvalue') loop
        select count(*) into numMaterials
          from item_material_h
          where fk_item = item_id_cur.id;
        dbms_output.put_line(numMaterials);
      end loop;
    end;