Tem como usar FOR dentro do SELECT?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
ralexsander
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qua, 23 Nov 2005 10:07 am
Localização: SP

Olá,

Tenho uma PROCEDURE que busca alguns registros em uma tabela e vê se algum registro desta busca tem sub-registros, se tiver ele apaga a linha do reegistro e insere seus registros filhos, isso fica num loop até que não haja mais registros filhos. Eu queria saber se é possível transformar essa procedure em um Select

Selecionar tudo

--	Create First Level
FOR bom IN CUR_BOM (pp.M_Product_ID) LOOP
    INSERT INTO M_ProductionLine
            (M_ProductionLine_ID, M_ProductionPlan_ID, Line,
            AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
            M_Product_ID, MovementQty, M_Locator_ID)
    VALUES
            (NextNo, pp.M_ProductionPlan_ID, Line,
            pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
            bom.M_ProductBOM_ID, -pp.ProductionQty*bom.BOMQty, pp.M_Locator_ID);
END LOOP;

--	While we have BOMs
LOOP
    --	Are there non-stored BOMs to list details?
    SELECT COUNT(*) INTO CountNo
    FROM M_ProductionLine pl, M_Product p
    WHERE pl.M_Product_ID=p.M_Product_ID
      AND pl.M_ProductionPlan_ID=pp.M_ProductionPlan_ID
      AND pl.Line<>100	--	Origin Line
      AND p.IsBOM='Y' AND p.IsStocked='N';
    --	Nothing to do
    EXIT WHEN (CountNo = 0);
    --

    --	Resolve BOMs in ProductLine which are not stocked
    FOR pl IN CUR_PLineBOM (pp.M_ProductionPlan_ID) LOOP
      Line := pl.Line;
      --	Resolve BOM Line in product line
      FOR bom IN CUR_BOM (pl.M_Product_ID) LOOP
              ResultStr := 'CreatingLine Products2';
              Line := Line + 10;
              AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
              INSERT INTO M_ProductionLine
                      (M_ProductionLine_ID, M_ProductionPlan_ID, Line,
                      AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
                      M_Product_ID, MovementQty, M_Locator_ID)
              VALUES
                      (NextNo, pp.M_ProductionPlan_ID, Line,
                      pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
                      bom.M_ProductBOM_ID, pl.MovementQty*bom.BOMQty, pp.M_Locator_ID);
      END LOOP;
      --	Delete BOM line
      DELETE  M_ProductionLine
      WHERE 	M_ProductionLine_ID=pl.M_ProductionLine_ID;
    END LOOP;
END LOOP;	--	While we have BOMs
Obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bom, é possível pegar numa query com CONNECT BY todos os registros que satisfazem X condição.
Mas essa condição fica mudando em tempo de execução, aí só com procedure mesmo.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes